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>
也可以。
我想要一个 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>
也可以。