Ajax 和 Spring 控制器之间的跨源被阻止

Cross origin blocked between Ajax and Spring Controller

我想要一个 Javascript 函数来将数据发送到 Spring 控制器并获得响应。但是,由于 strict-origin-when-cross-origin Referrer 政策,请求没有通过。

Spring 控制器:

@Controller
public class EventController {

@ResponseBody
@RequestMapping(value = "/event", method = RequestMethod.POST)
public String handleAjax(@RequestParam Integer id, HttpServletRequest request, HttpServletResponse response) {

    response.setHeader("Access-Control-Allow-Origin", "*");

    return "OK";

}
}

Javascript 函数:

function getContextPath() {
return window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
}  

function move(moveDir,velocity){
$.ajax({
    type : "POST",
    url : getContextPath()  + "/event",
    success: function(data){
        console.log(data)
    }
});
}

我知道我必须允许这些文件的跨源。到目前为止,我尝试过的东西都没有用。 我尝试过的列表:

-> 添加 @CrossOrigin(origins = "http://localhost:8081", maxAge = 3600) 到控制器

-> 添加 response.setHeader("Access-Control-Allow-Origin", "*"); 到控制器

-> 添加 crossorigin="anonymous" 到 Javascript <script> 标签

您的代码将无法运行,因为您指定仅支持 POST 方法

@RequestMapping(value = "/event", method = RequestMethod.POST)

CORS 中的预检请求需要 OPTIONS 方法。

因此您必须支持 POST 和 OPTIONS 才能使其正常工作。

@RequestMapping(value = "/event")
@RequestMapping(value = "/event", method = { RequestMethod.POST, RequestMethod.OPTIONS })

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS

我终于明白了。有两个问题。

首先是我必须将 header 添加到 ajax 请求中,以允许请求由服务器处理:headers: { 'Access-Control-Allow-Origin': '/path_to_request_target' },。用 '*' 代替 '/path_to_request_target' 也可以。

第二个是我的 dispatcher servlet。我不得不将 .html 放在 URL 的末尾:url : getContextPath() + "/event.html",。这是由于我的调度程序 servlet 的映射:

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/index.jsp</url-pattern>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

.html 添加到 URL 是因为 <url-pattern>*.html</url-pattern>。添加满足初始 URL 格式的 <url-pattern> 也可以。