当前位置:  开发笔记 > 编程语言 > 正文

跨域放置调用不适用于Access-Control-Allow-Origin

如何解决《跨域放置调用不适用于Access-Control-Allow-Origin》经验,为你挑选了1个好方法。

我面临与跨域PUT调用相关的问题,我已经允许来自服务器端的Access-Control-Allow-Origin仍然无法正常工作.

    @PUT
    @Path("/getresponse/{caller}")
    @Produces({MediaType.APPLICATION_JSON})
    public Response getResponseData(@PathParam("caller") String caller ,@QueryParam("ticket")String ticket ,@FormParam("formParam") String data){


        ResponseBuilder resp;
        System.out.println("name of caller is -> "+ caller);
        System.out.println("query param ticket -> "+ ticket);
        System.out.println("form param data->" + data);
        Employee emp = new Employee();
        emp.setAge(23);
        emp.setName("data");
        Gson gson = new Gson();
        String responseJson =  gson.toJson(emp);
        resp=Response.ok(responseJson);//header("Access-Control-Allow-Origin", "*")
        resp.header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS");

         return resp.build();
    }

每当我从jquery ajax方法调用它时,它表示 对预检请求的响应没有通过访问控制检查:请求的资源上没有'Access-Control-Allow-Origin'标头

我有相同的上述服务的副本,但有POST签名,当我调用该服务时,它调用服务没有任何问题邮政服务代码是

    @POST
    @Path("/getresponses/{caller}")
    @Produces({MediaType.APPLICATION_JSON})
    public Response getResponseData1(@PathParam("caller") String caller ,@QueryParam("ticket")String ticket ,@FormParam("formParam") String data){


        ResponseBuilder resp;
        System.out.println("name of caller is -> "+ caller);
        System.out.println("query param ticket -> "+ ticket);
        System.out.println("form param data->" + data);
        Employee emp = new Employee();
        emp.setAge(23);
        emp.setName("data");
        Gson gson = new Gson();
        String responseJson =  gson.toJson(emp);
        resp=Response.ok(responseJson);//header("Access-Control-Allow-Origin", "*")
        resp.header("Access-Control-Allow-Origin", "*")
        .header("Access-Control-Allow-Methods", "GET, POST");
        return resp.build();
    }

我的客户端代码是

$(document).ready(function(){
    // for post service
    $('#sendcall').on('click',function(e){
        var dataTosend ="formParam=data to send";
        $.ajax({
              url: 'http://someip:8099/Jqgrid/rest/getdata/getresponses/data?ticket=tick',
              contentType : 'application/x-www-form-urlencoded',
              data :dataTosend,   
              type: 'POST',
              success: function(data){
                alert(data);
              }
            });
    });

    //for PUT service
    $('#sendcall2').on('click',function(e){
        var datatosend ="formParam=data to send";
        $.ajax({
              url: 'http://someip:8099/Jqgrid/rest/getdata/getresponse/aliahsan?ticket=tick',
              contentType : 'application/x-www-form-urlencoded',
              data :datatosend,   
              type: 'PUT',
              crossDomain:true,
              beforeSend: function (xhr) {

                    console.log('header added');
                },
              success: function(data){
                alert(data);
              }
            });
    });
});

在这方面请帮助我PUT为什么不使用它.任何帮助将不胜感激



1> Paul Samsoth..:

而不是增加你的资源的方法里面所有的CORS头,使用过滤器新泽西州,如所描述在这个岗位.其原因是CORS预检请求,它在HTTP访问控制(CORS)中定义为:

"preflighted"请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送.

所以请求是一个OPTIONS请求,它期望返回"Accept-Xxx"CORS头来确定服务器允许的内容.因此,将标头放在资源方法中没有任何影响,因为请求是使用OPTIONS HTTP方法进行的,您没有资源方法.这通常会导致向客户端发送405 Method Not Allowed错误.

当您在过滤器中添加标头时,每个请求都会通过此过滤器,甚至是OPTIONS请求,因此预检会获得相应的标头.

至于PUT,也在上面的链接文件中描述(从上面的引用继续)

跨站点请求是这样预检的,因为它们可能对用户数据有影响.特别是,如果出现以下情况,请求会被预检:

它使用GET,HEAD或POST以外的方法.此外,如果POST用于发送具有除application/x-www-form-urlencoded,multipart/form-data或text/plain之外的Content-Type的请求数据,例如,如果POST请求将XML有效负载发送到服务器使用application/xml或text/xml,请求预检.

它在请求中设置自定义标头(例如,请求使用诸如X-PINGOTHER之类的标头)

这就是POST请求不会遇到同样问题的原因.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有