跨域 CrossOrigin

跨域 CrossOrigin


重要参考文档:

http://frontenddev.org/article/ajax-browser-cross-domain-request-access-control.html#heading-3-16

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS


解决跨域访问sessionid不一致的问题:

添加”Access-Control-Allow-Credentials”, “true”

https://www.v2ex.com/t/332337


浏览器默认不支持ajax跨域访问, ajax解决跨域限制:
url: “http://…….”,
type: ‘GET’,
dataType: ‘JSONP’,
success: function (data) { }


@crossOrigin注解针对Controller类或方法(所以prehandle处使用注解没用),也可通过webmvc全局指定:

private String[] alloweredOrigins = {"http://oss.cdn.letv.cn"};

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOrigins(alloweredOrigins)
                    .allowCredentials(true)
                    .maxAge(3600)
                    .allowedHeaders("Origin", "X-Requested-With", "Content-Type", "Accept");
        }
    };
}

运行时何处会添加responseHeader的Origin?

  1. prehandle:

  2. RequestMapping方法(该方法执行结束后添加)

  3. posthandle

  4. aftercomplish

crossOrigin注解中的method,如果写了会覆盖requestMethod中指定的,不写的话默认就是requestMethod中指定的。

request中默认会设定自己的Origin。


如上链接官方文档所说,只有简单请求才会触发preflight.

所以postman测试本地程序时:

get方法,以及body为空的post,设置的跨域不起作用,request中header的origin为空。就跟没设置一样。 浏览器get也不起作用
body包含了文件的post,设置的跨域起作用。此时request中header的origin不为空,response也不为空。(可以查看本地的origin)


注意maxAge,如果某个地方未能跨域访问,由于其缓存,导致其它本来能跨域访问的也不能访问了。

/** 匹配的是 /开始的所有路径及文件,包括//domain,也包括/domain
/* 匹配的是/开始的,包括/domain,但不包括//domain,也不包括/domain/file

所以如果设置了但不起作用,很可能是以下两个原因:

  1. 全局设定时路径没匹配对
  2. 多个路径的情况下有遗漏的路径没有设定,缓存的原因。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值