V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
haishiwuyuehao
V2EX  ›  问与答

SpringMvc 全局 CORS 解决方案

  •  
  •   haishiwuyuehao · 32 天前 · 671 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。
    @Component
    public class CORSConfig implements WebMvcConfigurer{
    
    	@Override
    	public void addCorsMappings(CorsRegistry registry) {
    		registry.addMapping("/**")
    				.allowedOrigins("*")
    				.allowedHeaders("*")
    				.allowedMethods("*")
    				.allowCredentials(true);
    		WebMvcConfigurer.super.addCorsMappings(registry);
    	}
    	
    }
    
    Connection	keep-alive
    Content-Type	application/json
    Date	Mon, 26 Oct 2020 01:04:07 GMT
    Keep-Alive	timeout=60
    Transfer-Encoding	chunked
    Vary	Origin, Access-Control-Request-Method, Access-Control-Request-Headers
    

    不再建议大家使用 WebMvcConfigurerAdapter 该类以过时

    CORS: Cross Origin Resouce Shading 跨资源共享,定义了浏览器与服务器如何实现跨源通信.CORS 背后的基本思路就是使用自定义的 HTTP 头部允许浏览器和服务器相互了解,以确实请求火响应应该是成功还是失败。

    对于简单的请求,比如 GET 或 POST 请求,没有自定义头部,而且请求体是 text/plain 类型,在发送请求前,浏览器在发送请求时会有一个额外的头部Origin Origin 头部包含发送请求的源,以便服务器确定是否为其提供响应。

    在发送请求时,浏览器添加的 Origin
    Origin:http://127.0.0.1:5500
    
    整个请求头
    GET /menu/all HTTP/1.1
    Host: 127.0.0.1:8080
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0
    Accept: */*
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Referer: http://127.0.0.1:5500/index.html
    Origin: http://127.0.0.1:5500
    Connection: keep-alive
    Cache-Control: max-age=0
    
    响应头:
    Access-Control-Allow-Origin: http://127.0.0.1:5500
    Access-Control-Allow-Origin 设置该源,表示允许该源访问。Java 代码里设置的
    

    CORS 预检请求,除开 POST,GET 请求以外的其它高级请求需要被响应的话.浏览器会先发送一个 OPTIONS 请求,在该请求中设置请求头Access-Control-Allow-Method需要被响应的方法 Access-Control-Allow-Headers需要被响应的请求包含的请求头

    服务器会在响应头中给出支持的信息

    Access-Control-Allow-Origin:	支持的源
    Access-Control-Allow-Methods:	支持的请求方法列表
    Access-Control-Allow-Headers:	支持的自定义请求头
    Access-Control-Allow-Max-Age:	缓存预检查请求的秒数
    
    响应:
    Access-Control-Allow-Origin: http://127.0.0.1:5500
    Access-Control-Allow-Methods: GET, POST, OPTIONS, DELETE, PUT
    Access-Control-Allow-Headers: origin
    Access-Control-Allow-Max-Age: 1728000
    

    MDN:@https://developer.mozilla.org/zh-CN/docs/Glossary/Preflight_request

    10 条回复    2020-10-26 13:54:26 +08:00
    wanacry
        1
    wanacry   32 天前
    你在教我做事?
    haishiwuyuehao
        2
    haishiwuyuehao   32 天前
    @wanacry 星仔,你在教我做事?
    shenlanAZ
        3
    shenlanAZ   32 天前
    你这不是相当于把跨域关掉了么,那你 cookie 安全的解决方案呢?

    还有 WebMvcConfigurerAdapter 过时也要看版本的,至少也要把相应的 spring 版本标出来吧。
    wysnylc
        4
    wysnylc   32 天前
    跨域让运维用 nginx 搞,别在项目里折腾
    jzmws
        5
    jzmws   32 天前
    @wysnylc 用 nginx 搞应该是最合适的一个
    w292614191
        6
    w292614191   32 天前
    CSDN ?
    w292614191
        7
    w292614191   32 天前
    "CORS 预检请求,除开 POST,GET 请求以外的其它高级请求需要被响应的话.浏览器会先发送一个 OPTIONS 请求,"

    我 POST 还是会发送 OPTIONS 请求。

    你测试了吗?
    w292614191
        8
    w292614191   32 天前
    napsterwu
        9
    napsterwu   32 天前 via iPhone
    Spring 这个不太好用,遇到异常标头就没了,安卓有的设备没有 Origin 头,他也不返回标头。ng 比较实在,如果没有 ng,自己写个简单的 interceptor 也好
    Boyce
        10
    Boyce   31 天前
    @w292614191 POST 时 Content-Type 为 application/json 也会发送 OPTIONS 预请求。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4004 人在线   最高记录 5268   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 05:16 · PVG 13:16 · LAX 21:16 · JFK 00:16
    ♥ Do have faith in what you're doing.