SpringMVC跨域

2017-10-22  本文已影响0人  winyiwin

开发过程中,常常会遇到跨域访问的问题,下面记录一下常用的解决方案。

  1. 可以从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]

上一篇 下一篇

猜你喜欢

热点阅读