【发布时间】:2015-12-21 13:24:01
【问题描述】:
我面临与跨域 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 不适用于此。 任何帮助将不胜感激
【问题讨论】:
-
不要在方法中添加 CORS 标头。 Use a filter
-
为什么在 @peeskillet 方法中使用过滤器但不使用 CORS 的原因
-
CORS 的工作原理是首先有一个预检请求,这是一个 OPTIONS 请求(在实际请求之前),以尝试获取 CORS 标头。所以方法中的标题没有任何意义。
-
@peeskillet 你能告诉我为什么在 POST 的情况下没有预检请求,但在 PUT 的情况下有预检请求??
-
一般使用application/x-www-form-urlencoded,不需要预检。更常见的是 JSON 需要它。因此,由于内容类型,POST 不需要处理预检。在 PUT 中,您使用
crossDomain: true强制执行跨域请求。见jQuery.ajax。另请阅读有关 CORS 的更多信息,请参阅 here