Jersey 跨域put调用不适用于访问控制允许来源
我面临与跨域PUT调用相关的问题,我已从服务器端允许访问控制允许源站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
@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的更多信息,请参阅