0

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

弹簧控制器:

@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>标签

4

2 回答 2

0

您的代码将不起作用,因为您指定仅支持 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

于 2021-11-18T13:56:50.897 回答
0

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

首先是我必须将该标头添加到ajax请求中,以允许服务器处理该请求:headers: { 'Access-Control-Allow-Origin': '/path_to_request_target' },. 放置'*'而不是'/path_to_request_target'也可以。

第二个是我的调度程序 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-pattern>满足初始 URL 格式的也可以。

于 2021-11-18T19:45:23.723 回答