CORS error跨域问题的原因分析和解决

CORS error跨域问题的原因分析和解决


后台重写了WebMvcConfigurer的addCorsMappings的方法或者controller加了@CrossOrigin注解为什么不生效?

什么是CORS error?跨域错误(Cross-Origin Error)是在Web开发中常见的错误之一,它发生在浏览器执行跨源请求(从一个源访问另一个源)时。同源策略(Same-Origin Policy)是浏览器的安全机制,它限制了通过脚本在不同源之间进行跨域通信。"源"是由协议、主机名和端口号组成的标识符。如果两个页面的协议、主机名和端口号完全相同,则它们被视为同源。反之,协议、主机名和端口号只要有一个不同,则属于不同源。同源策略的存在是为了保障网站安全、防止跨站脚本攻击。

我接触的项目里有通过重写WebMvcConfigurer的addCorsMappings方法

@Override
    public void addCorsMappings(CorsRegistry corsRegistry){
        corsRegistry.addMapping("/**")
                .allowCredentials(true)
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .allowedHeaders("*")
                .maxAge(3600);
    }

或者controller里加@CrossOrigin注解
发现没有生效,浏览器仍报CORS error

代码报错位置和调试发现每次报错都是在HandlerInterceptor的preHandle重写方法里,这时怀疑和全局的拦截器有关,通过设置不拦截特定的请求发现的确生效,但是拦截器又不可能全部关闭;

回到最开始的问题,浏览器报了跨域,为什么呢?
浏览器如何判断当前是否跨域呢?当发送跨域的POST请求时,浏览器会在发送真实请求之前先发送一个OPTIONS请求,这个请求相当于一个探子,如果发现目标路径不可达浏览器就会直接拦截前端的请求,导致后续的真实请求(比如GET、POST、PUT、DELETE)无法发送到后端。

所以错误的跟本原因在于OPTIONS,由于配置了登录拦截器,对于放行请求,不会有什么问题,但是对于没有放行的请求,会直接拦截OPTIONS请求,OPTIONS请求是一个探测请求,内部并不会携带token,所以就直接导致OTIONS请求被拦截,这样就会让浏览器觉得请求不可达,直接在前端报CORS error;

问题定位了,那就很简单了,拦截器里放行options请求就可以了

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        if (request.getMethod().equals("OPTIONS")) {
            //设置了登录全局拦截,会导致跨域的OPTIONS尝试请求被拦截,这里放开
            return true;
        }
        //登录业务判断
        return true;
    }

debug,发现请求都成功了,搞定!

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaJavaScript中使用CORS(跨域资源共享)解决跨域问题的步骤如下: 1. 在Java后端设置CORS支持:在处理跨域请求的Java代码中,需要设置响应头以启用CORS。可以通过在响应对象中设置以下响应头字段来实现: ```java response.setHeader("Access-Control-Allow-Origin", "http://example.com"); // 允许特定的源访问 response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); // 允许的HTTP方法 response.setHeader("Access-Control-Allow-Headers", "Content-Type"); // 允许的请求头 response.setHeader("Access-Control-Allow-Credentials", "true"); // 是否允许发送Cookie response.setHeader("Access-Control-Max-Age", "3600"); // 预检请求的有效期 ``` 2. 在JavaScript前端发起跨域请求:在发送跨域请求的JavaScript代码中,需要设置请求头以指示该请求是一个跨域请求。可以使用XMLHttpRequest或fetch API来发送请求,并在请求头中添加以下字段: ```javascript fetch('http://api.example.com/data', { method: 'GET', headers: { 'Content-Type': 'application/json', 'Origin': 'http://example.com' // 请求源 }, credentials: 'include' // 发送Cookie }) .then(response => { // 处理响应 }) .catch(error => { // 处理错误 }); ``` 通过以上步骤,Java后端设置了CORS支持,允许特定源访问资源,并在JavaScript前端发送跨域请求时设置了请求头,指示该请求是一个跨域请求。这样就可以解决跨域问题。请注意,实际应用中需根据自己的需求和安全考虑进行适当的配置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值