2015-12-21 135 views
0

我面临着与跨域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(); 
    } 

每当我调用它从jquery的AJAX方法,它说 响应预检请求未通过访问控制检查:否“访问控制允许来源”标题存在于所请求的资源

我有以上服务的,但与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

不要在方法中添加CORS标头。 [使用过滤器](http://stackoverflow.com/a/28067653/2587435) –

+0

为什么在过程中使用过滤器但不使用方法中的CORS @peeskillet – Ali

+1

CORS的工作原理是,首先有一个预检请求,它是OPTIONS请求(在实际请求之前),尝试获取CORS头文件。所以方法中的头文件什么都没有。 –

回答

4

而不是在您的资源方法内添加所有的CORS头,使用泽西岛过滤器,如in this post所述。这样做的原因,是CORS预检请求,这是在HTTP access control (CORS)定义为:

“预检”请求第一发送由OPTIONS方法对其他域的资源的HTTP请求,以确定实际请求是否安全发送。

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

在过滤器中添加标题时,每个请求都会经过此过滤器,即使是OPTIONS请求,也是如此,因此预检会获取相应标题。

对于PUT,也

跨站请求被预检这样上述链接的文档(从上面的报价仍在进行中)中描述,因为它们可以具有对用户数据的影响。特别是,如果发生以下情况,请求将被预冲:

  • 它使用GET,HEAD或POST以外的方法。另外,如果POST用于发送具有除application/x-www-form-urlencoded,multipart/form-data或text/plain之外的Content-Type的请求数据,如果POST请求使用application/xml或text/xml向服务器发送XML有效内容,则会请求该请求。
  • 它设置自定义首部的请求(例如请求使用的报头,如X PINGOTHER)

这就是为什么POST请求不面临同样的问题。

相关问题