当前位置: 首页 > news >正文

SpringBoot跨域问题解决

前端访问后台接口时,浏览器报错,跨域无法访问。

报错信息如下:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

经过一番百度之后,需要在控制器上添加处理跨域的注解,

注解添加后,再次访问接口,又有了新的报错:

Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

根据资料显示,这个是因为浏览器预检请求失败,复杂请求会做预检请求,比如header中有自动以的属性等情况,当前的报错是指OPTION 请求失败,需要后端放行 OPTION 请求。

解决方法是定义个拦截器: 

CorsInterceptor.java

package com.interceptor;import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;@Component
public class CorsInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");response.setHeader("Access-Control-Max-Age", "86400");response.setHeader("Access-Control-Allow-Headers", "*");// 如果是OPTIONS则结束请求if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {response.setStatus(HttpStatus.NO_CONTENT.value());return false;}return true;}
}

然后将拦截器注册到全局拦截器中,使其生效。

WebConfig.java

package com.config;import com.interceptor.CorsInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate CorsInterceptor corsInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//跨域拦截器需放在最上面registry.addInterceptor(corsInterceptor);}
}

 

再次访问接口,请求正常返回了

参考链接:

「日常报错」Response to preflight request doesn't pass access control check: It does not have HTTP ok status. - Posase - 博客园 (cnblogs.com)

为什么出现OPTIONS?SpringBoot接口跨域解决方案 - 简书 (jianshu.com) 

http://www.lryc.cn/news/285273.html

相关文章:

  • FindMy技术与相机结合
  • Windows WSL2 占用磁盘空间清理释放
  • 2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析
  • 2.C语言——控制语句
  • Linux网络之PXE高效批量装机、Kickstart全自动化安装
  • react umi/max 页签(react-activation)
  • 计算机网络编程
  • 【计算机网络实训】期末考题-路由重分发+三层交换机VLAN间路由
  • git 常规操作及设置
  • element中表格组件的row-class-name和class-name属性的使用以及无效处理
  • 【AI理论知识】EM算法
  • 03 OSPF
  • node.js(express.js)+mysql实现注册功能
  • AI绘画Stable Diffusion进阶使用
  • C 练习实例33 - 质数(素数)判断
  • docker环境下mongo副本集的部署及异常修复
  • 【Java】Maven的安装与配置
  • 向量和向量如何相乘?
  • 计算机组成原理 指令流水线
  • macOS - md5 | md5sum
  • Tomcat快速入门
  • 如何结合antd design pro 5 结合express 上传多个文件
  • Django随笔
  • 线程和进程的区别(从JVM角度出发)
  • 手把手教你如何快速定位bug,如何编写测试用例,快来观摩......
  • 计算矩阵边缘元素之和(c++)
  • java使用jsch处理软链接判断是否文件夹
  • 【2023】java使用WebClient实现chatGPT调用建立web socket连接
  • 力扣【四数之和】
  • IMX6LL|linux设备驱动模型