SpringBoot拦截器设置解决跨域问题

本文详细介绍了在SpringBoot项目中,如何通过在拦截器的preHandle方法中正确设置响应头来解决跨域问题。特别指出,在withCredentials为true的情况下,Access-Control-Allow-Credentials必须设为true,且Access-Control-Allow-Origin不能设置为*。

Springboot使用WebMvcConfigurer的addCorsMappings的方法设置全局跨域,可以解决大部分的跨域问题,但是加入拦截器后,拦截器需要单独做跨域处理,否则还是有跨域问题的。

在我项目中,加在拦截器的preHandle方法的头部,是解决不了的,后来经过测试,发现只有在返回false的方法块中加入response设置跨域才可以真正解决跨域问题

response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true"); 

另外,当前端的请求中是withCredentials = true是,必须设置response.setHeader("Access-Control-Allow-Credentials", "true");

同时Access-Control-Allow-Origin不能设置未 “*”,否则还是会报错。

看了很多博客,都是直接加在方法一开始的时候的,但是我这个就是不行,只能加在返回false 的方法里面才生效。以此记录。

### 如何在Spring Boot中通过拦截器实现配置 #### 1. 拦截器的关系 在Spring Boot中,虽然可以通过`@CrossOrigin`注解或全局过滤器来解决问题[^2],但也可以利用拦截器完成类似的逻辑。拦截器可以在请求到达控制器之前对其进行预处理,因此非常适合用来设置响应头以支持。 --- #### 2. 实现步骤 ##### (1) 创建Spring Boot项目并引入依赖 确保项目的`pom.xml`文件中有以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` --- ##### (2) 定义拦截器类 创建一个自定义拦截器类,继承`HandlerInterceptor`接口,并重写其方法: ```java import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class CorsInterceptor implements org.springframework.web.servlet.HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 设置允许的源、方法和头部字段 response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); // 如果是OPTIONS请求,则直接返回成功状态码 if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); return false; // 不继续向下执行 } return true; // 继续后续操作 } } ``` 上述代码设置了必要的响应头,并针对`OPTIONS`预检请求进行了特殊处理[^4]。 --- ##### (3) 注册拦截器 通过实现`WebMvcConfigurer`接口并将拦截器注册到Spring容器中: ```java 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 { private final CorsInterceptor corsInterceptor; @Autowired public WebConfig(CorsInterceptor corsInterceptor) { this.corsInterceptor = corsInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { // 添加拦截器并指定路径规则 registry.addInterceptor(corsInterceptor) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/api/auth/**"); // 排除认证相关路径[^5] } } ``` --- ##### (4) 测试功能 编写一个简单的控制器测试效果: ```java import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TestController { @GetMapping("/test") public String test() { return "This is a cross-origin test!"; } } ``` 启动应用程序后,尝试从其他名发起GET请求至`/test`端点,验证是否能够正常接收数据。 --- ### 总结 以上展示了如何借助Spring Boot中的拦截器实现配置的过程。相比传统的XML方式更加简洁高效,同时也保留了灵活性,便于开发者根据实际需求调整路径匹配规则或其他参数[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值