Javascript 标题访问控制允许源代码:*在Spring MVC上工作不正常
我有一个使用RESTfulWeb服务在SpringMVC上运行的web应用程序。我试图从HTML/Javascript文件向这些web服务发送JSON。下面是Javascript:Javascript 标题访问控制允许源代码:*在Spring MVC上工作不正常,javascript,jquery,rest,spring-mvc,cors,Javascript,Jquery,Rest,Spring Mvc,Cors,我有一个使用RESTfulWeb服务在SpringMVC上运行的web应用程序。我试图从HTML/Javascript文件向这些web服务发送JSON。下面是Javascript: $.ajax ( { type: "post", data: JSON.stringify(data), contentType : "application/json", dataType: "json", url: "http://localhost/proj/servic
$.ajax
(
{
type: "post",
data: JSON.stringify(data),
contentType : "application/json",
dataType: "json",
url: "http://localhost/proj/service",
success: function(data)
{
callback(data);
}
}
);
以及Spring MVC中的映射:
@RequestMapping(value = "/proj/service/", method = RequestMethod.POST)
public ModelAndView procRequest(@RequestBody String paramsJson, HttpServletResponse resp, WebRequest request_p){
resp.setStatus(HttpStatus.CREATED.value());
resp.setHeader("Location", request_p.getContextPath() + "/proj/service");
resp.addHeader("Access-Control-Allow-Origin", "*");
//Code
}
出于某种原因,当我从ajax请求中删除contentType键时,它会通过,但当然它的格式不正确,因为我希望Javascript向我发送JSON字符串。但由于某些原因,如果我保留contentType键,则会出现以下错误:
XMLHttpRequest cannot load http://localhost:8080/proj/service/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
我不知道是什么原因导致了这个错误,因为有适当的标题
谢谢。内容类型标题会触发CORS飞行前请求。您需要修改处理程序以使用以下标题响应选项请求:
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
这将向飞行前请求发送适当的响应,之后浏览器将发出实际请求。您可以在此处了解有关飞行前请求的更多信息:内容类型标头触发CORS飞行前请求。您需要修改处理程序以使用以下标题响应选项请求:
resp.addHeader("Access-Control-Allow-Origin", "*");
resp.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
resp.addHeader("Access-Control-Allow-Headers", "Content-Type");
这将向飞行前请求发送适当的响应,之后浏览器将发出实际请求。您可以在此处了解有关飞行前请求的更多信息:我是这样做的:
@RequestMapping("/listActions")
public @ResponseBody List<Action> list(HttpServletRequest request, HttpServletResponse response) {
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(1, "Do something fantastic"));
actions.add(new Action(2, "Save the world"));
actions.add(new Action(3, "Buy beer"));
actions.add(new Action(4, "Butcher a hog"));
return actions;
}
我是这样做的:
@RequestMapping("/listActions")
public @ResponseBody List<Action> list(HttpServletRequest request, HttpServletResponse response) {
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
response.addHeader("Access-Control-Allow-Headers", "Content-Type");
List<Action> actions = new ArrayList<Action>();
actions.add(new Action(1, "Do something fantastic"));
actions.add(new Action(2, "Save the world"));
actions.add(new Action(3, "Buy beer"));
actions.add(new Action(4, "Butcher a hog"));
return actions;
}
飞行前请求似乎没有问题,因为在跟踪中会明确显示,否则选项方法失败。@另外,您指的是哪个跟踪?无论预飞行失败还是实际请求失败,浏览器控制台日志中的错误看起来都是相同的。因为当预飞行出现问题时,您会收到两个错误:选项http://foo/bar 起源http://foo 访问控制允许原点不允许。然后无法加载XMLHttpRequesthttp://foo/bar. 起源http://foo Access-Control-Allow-Origin不允许使用。您正在使用哪个浏览器?我在浏览器中看不到这一点。如果飞行前失败,实际的请求将永远不会通过,因此无论如何都应该有一个请求。我正在使用Chrome。如果请求的标头或方法丢失,他们可能会添加该选项以给出更具体的错误。这看起来不是飞行前请求的问题,因为这在跟踪中是明确的,否则选项方法失败。@plus,您指的是哪个跟踪?无论预飞行失败还是实际请求失败,浏览器控制台日志中的错误看起来都是相同的。因为当预飞行出现问题时,您会收到两个错误:选项http://foo/bar 起源http://foo 访问控制允许原点不允许。然后无法加载XMLHttpRequesthttp://foo/bar. 起源http://foo Access-Control-Allow-Origin不允许使用。您正在使用哪个浏览器?我在浏览器中看不到这一点。如果飞行前失败,实际的请求将永远不会通过,因此无论如何都应该有一个请求。我正在使用Chrome。如果请求的头或方法丢失,他们可能会添加该项以给出更具体的错误。