spring boot CrossOrigin不生效?

直接postman, curl, 浏览器访问后端接口, response header是不会自动加上Access-Control-Allow-Origin的。

需要在ajax中调用,客户端request中会加上Origin请求头 (首先要保证发出的是跨站请求!!!), 服务器端才会加上response响应头

  1. 出现这个提示,说明chrome根本没有发送这个请求给后端,  99%是因为ajax代码中没有写http://  或者 https://


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


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

 浏览器会先发送一个preflight检查response header是否有Access-Control-Allow-Origin等, 注意这是个OPTIONS请求


  1. 浏览器发出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 *

https://answers.microsoft.com/en-us/microsoftedge/forum/all/disable-cors/55c89fb6-8d72-4318-9ee3-e9cdfc6fa708

posted @ 2018-11-06 15:35  funny_coding  阅读(12548)  评论(0)    收藏  举报
build beautiful things, share happiness