spring boot CrossOrigin不生效?
直接postman, curl, 浏览器访问后端接口, response header是不会自动加上Access-Control-Allow-Origin的。
需要在ajax中调用,客户端request中会加上Origin请求头 (首先要保证发出的是跨站请求!!!), 服务器端才会加上response响应头
- 出现这个提示,说明chrome根本没有发送这个请求给后端, 99%是因为ajax代码中没有写http:// 或者 https://

- 出现这个提示,说明后端或者nginx可能配置了重定向 ,比如http自动跳转https也算重定向

- 出现这个提示,说明服务端没写相应头 Access-Control-Allow-Origin


浏览器会先发送一个preflight检查response header是否有Access-Control-Allow-Origin等, 注意这是个OPTIONS请求
- 浏览器发出origin请求后,服务器端才能写响应头

参考:
https://spring.io/guides/gs/rest-service-cors/
开发阶段的Vue ProxyTable配置 https://segmentfault.com/a/1190000014396546
临时禁用chrome的CORS policy
关闭所有已经打开的chrome实例, CMD执行:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:\chrome_dev"
Cors请求经过filter之后进入dispatcherServlet
查找对应的handler (Controller+Method) , getHandler()中会构造HandlerExecutionChain, 并在HandlerExecutionChain中维护cors HandlerInterceptor


applyPreHandle() 中调用DefaultCorsProcessor

DefaultCorsProcessor的处理过程如下:

curl示例:

另外一种情况是因为在进入Controller之前 filter没过 直接返回302跳转了, 这时响应头是没有跨域字段的。 常见于用了spring security, 要仔细检查配置。
org.springframework.security.web.csrf.CsrfFilter
默认csrf token是放在session中的,就是只能在服务器端取到(JSP session), 浏览器是取不到的, 而且token按理不需要返回给browser。如果一定要返回,可以使用CookieCsrfTokenRepository
文档:https://docs.spring.io/spring-security/site/docs/5.2.8.RELEASE/reference/html/protection-against-exploits.html#servlet-csrf-configure-custom-repository
nginx中可以在server级别设置成允许全局跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Expose-Headers *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,xxxx';
if ($request_method = 'OPTIONS') {
return 204;
}
java example:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "*");
return true;
}
response.setHeader("Access-Control-Expose-Headers", "*");
response.setHeader("Access-Control-Allow-Origin", "*");
记一个响应头没有获取到 导致的JS OOM问题
现象:xhr提交后浏览器内存迅速占用了8G内存, js中获取response headers只有一个content-type, 其他啥都没有, body却能正常访问。
起初以为是浏览器升级本身引起的,或者js框架的问题, 一个total count的header不至于OOM. 最后回滚代码 才确认是它的问题。
原因: 跨域之后 默认只有几个header是暴露给js访问的, 即使服务器和控制台network里已经显示响应头返回了,js还是获取不到。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers
解决方法:加上Access-Control-Expose-Headers *

浙公网安备 33010602011771号