Jersey 跨域put调用不适用于访问控制允许来源

Jersey 跨域put调用不适用于访问控制允许来源,jersey,cors,put,Jersey,Cors,Put,我面临与跨域PUT调用相关的问题,我已从服务器端允许访问控制允许源站PUT,但它仍然不起作用 @PUT @Path("/getresponse/{caller}") @Produces({MediaType.APPLICATION_JSON}) public Response getResponseData(@PathParam("caller") String caller ,@QueryParam("ticket")String ticket ,@FormPa

我面临与跨域PUT调用相关的问题,我已从服务器端允许访问控制允许源站PUT,但它仍然不起作用

    @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();
    }
无论何时我从jQueryAjax方法调用它,它都会说 对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头

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

    @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不能处理此问题。
任何帮助都将不胜感激

如前所述,使用Jersey过滤器,而不是在资源方法中添加所有CORS头。原因是CORS飞行前请求,在中定义为:

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

因此,该请求是一个选项请求,它希望返回“Accept Xxx”CORS头以确定服务器允许的内容。因此,将头放在resource方法中没有任何影响,因为请求是使用OPTIONS HTTP方法发出的,而您没有用于该方法的resource方法。这通常会导致向客户端发送405方法不允许的错误

当您在过滤器中添加标题时,每个请求都会通过此过滤器,甚至是选项请求,因此预飞行将获得相应的标题

关于看跌期权,也在上述链接文件中描述(从上述报价继续)

跨站点请求是这样预处理的,因为它们可能会影响用户数据。特别是,在以下情况下,请求将被预引导:

  • 它使用的方法不是GET、HEAD或POST。此外,如果POST用于发送内容类型不是application/x-www-form-urlencoded、multipart/form data或text/plain的请求数据,例如,如果POST请求使用application/XML或text/XML向服务器发送XML有效负载,则请求将被预引导
  • 它在请求中设置自定义标头(例如,请求使用诸如X-PINGOTHER之类的标头)

这就是POST请求不会面临相同问题的原因。

如前所述,使用Jersey筛选器,而不是在资源方法中添加所有CORS头。原因是CORS飞行前请求,在中定义为:

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

因此,该请求是一个选项请求,它希望返回“Accept Xxx”CORS头以确定服务器允许的内容。因此,将头放在resource方法中没有任何影响,因为请求是使用OPTIONS HTTP方法发出的,而您没有用于该方法的resource方法。这通常会导致向客户端发送405方法不允许的错误

当您在过滤器中添加标题时,每个请求都会通过此过滤器,甚至是选项请求,因此预飞行将获得相应的标题

关于看跌期权,也在上述链接文件中描述(从上述报价继续)

跨站点请求是这样预处理的,因为它们可能会影响用户数据。特别是,在以下情况下,请求将被预引导:

  • 它使用的方法不是GET、HEAD或POST。此外,如果POST用于发送内容类型不是application/x-www-form-urlencoded、multipart/form data或text/plain的请求数据,例如,如果POST请求使用application/XML或text/XML向服务器发送XML有效负载,则请求将被预引导
  • 它在请求中设置自定义标头(例如,请求使用诸如X-PINGOTHER之类的标头)

这就是POST请求不面临相同问题的原因。

不要在方法中添加CORS头。为什么在@peeskilletHow CORS works方法中使用filter有效而不使用CORS是因为首先有一个飞行前请求,这是一个选项请求(在实际请求之前),用于尝试获取CORS头。因此,方法中的标题没有任何意义。@peeskillet您能告诉我为什么POST中没有飞行前请求,而PUT中有飞行前请求??通常使用application/x-www-form-urlencoded,不需要飞行前请求。更常见的是JSON需要它。因此,由于内容类型的原因,文章不需要处理飞行前的内容。在PUT中,您使用
crossDomain:true
强制跨域请求。看见另外,要阅读有关CORS的更多信息,请参阅不要在方法中添加CORS头。为什么在@peeskilletHow CORS works方法中使用filter有效而不使用CORS是因为首先有一个飞行前请求,这是一个选项请求(在实际请求之前),用于尝试获取CORS头。因此,方法中的标题没有任何意义。@peeskillet您能告诉我为什么POST中没有飞行前请求,而PUT中有飞行前请求??通常使用application/x-www-form-urlencoded,不需要飞行前请求。更常见的是JSON需要它。因此,由于内容类型的原因,文章不需要处理飞行前的内容。在PUT中,您使用
crossDomain:true
强制跨域请求。看见另外,要了解有关CORS的更多信息,请参阅