Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 标题访问控制允许源代码:*在Spring MVC上工作不正常_Javascript_Jquery_Rest_Spring Mvc_Cors - Fatal编程技术网

Javascript 标题访问控制允许源代码:*在Spring MVC上工作不正常

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

我有一个使用RESTfulWeb服务在SpringMVC上运行的web应用程序。我试图从HTML/Javascript文件向这些web服务发送JSON。下面是Javascript:

$.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。如果请求的头或方法丢失,他们可能会添加该项以给出更具体的错误。