開發(fā)過程中普办,常常會遇到跨域訪問的問題黄伊,下面記錄一下常用的解決方案。
- 可以從Spring的官方blog截圖看到钓觉,從spring4.2GA開始茴肥,spring提供了一種跨域解決方案。
Jietu20171022-144319@2x.jpg
使用方法也特別簡單,只需在需要跨域訪問的方法注解@CrossOrigin就可以實(shí)現(xiàn)荡灾。
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
如果需要全局設(shè)置或當(dāng)個(gè)Controller方法設(shè)置則需要在Controller類上注解即可
@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {}
實(shí)驗(yàn)一下
如果不加@CrossOrigin瓤狐,則下面
<script>
$(function(){
console.log('--start---')
$.getJSON("http://localhost:8080/seckill/time/now",{},function(res) {
if(res) {
console.log(res);
}
})
});
</script>
執(zhí)行的第一次是可以訪問到方法的
Jietu20171022-143433@2x.jpg
但是瀏覽器中返回確是
Jietu20171022-143505@2x.jpg
接下來接著刷新瀏覽器,則是不會再次進(jìn)入到后臺方法的批幌。
加上注解之后础锐,則可以順利返回JSON值
加注解截圖
res1
不加注解截圖
res2
可以看到res1和res2中唯一不同的就是Response Headers
主要是 DefaultCorsProcessor #handleInternal方法幫我們做的Response的處理。
HttpHeaders responseHeaders = response.getHeaders();
responseHeaders.setAccessControlAllowOrigin(allowOrigin);
responseHeaders.add(HttpHeaders.VARY, HttpHeaders.ORIGIN);