开发过程中,常常会遇到跨域访问的问题,下面记录一下常用的解决方案。
- 可以从Spring的官方blog截图看到,从spring4.2GA开始,spring提供了一种跨域解决方案。
Jietu20171022-144319@2x.jpg
使用方法也特别简单,只需在需要跨域访问的方法注解@CrossOrigin就可以实现。
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
如果需要全局设置或当个Controller方法设置则需要在Controller类上注解即可
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {}
实验一下
如果不加@CrossOrigin,则下面
<script>
$(function(){
console.log('--start---')
$.getJSON("http://localhost:8080/seckill/time/now",{},function(res) {
if(res) {
console.log(res);
}
})
});
</script>
执行的第一次是可以访问到方法的
Jietu20171022-143433@2x.jpg但是浏览器中返回确是
Jietu20171022-143505@2x.jpg接下来接着刷新浏览器,则是不会再次进入到后台方法的。
加上注解之后,则可以顺利返回JSON值
加注解截图
res1
不加注解截图
res2
可以看到res1和res2中唯一不同的就是Response Headers
主要是 DefaultCorsProcessor #handleInternal方法帮我们做的Response的处理。
HttpHeaders responseHeaders = response.getHeaders();
responseHeaders.setAccessControlAllowOrigin(allowOrigin);
responseHeaders.add(HttpHeaders.VARY, HttpHeaders.ORIGIN);
资料
MDN
[构建public APIs与CORS]
网友评论