Springboot 跨域拦截器配置说明

错误代码

  • 跨域设置
java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    /**
     * cors 跨域配置
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
                .allowCredentials(true)
                .allowedOriginPatterns("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}
  • 业务拦截器
java 复制代码
public class LoginInterceptor implements HandlerInterceptor {

    // 白名单
    private static final Set<String> whiteList = new HashSet<>();

    static {
        whiteList.add("/index.html");
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println(request.getMethod());
        String url = request.getServletPath();
        if (whiteMatcher(url)) {
            return true;
        }
        String token = request.getHeader(tokenConfig.getHeader());
        System.out.println(token);
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        LoginCache.removeUser(); // 从当前线程移除登录用户信息
    }
}

问题

  • 业务拦截其中可能会拦截到"OPTIONS"类型的请求。

正确代码

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

import java.util.Arrays;
import java.util.Collections;

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedOriginPatterns(Collections.singletonList("*"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        config.setAllowedHeaders(Collections.singletonList("*"));
        config.setAllowCredentials(true);
        config.setMaxAge(86400L);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);
    }
}

底层代码说明

  • WebMvcConfigurer 方式:通过 addCorsMappings 配置的 CORS 规则会被封装为 HandlerMapping 级别的 CORS 处理器,它在 DispatcherServlet 处理请求时才会生效。
  • CorsFilter 方式:直接注册 CorsFilter 作为一个独立的过滤器,它在 FilterChain 最前端执行,早于 DispatcherServlet 和所有拦截器。
相关推荐
子豪-中国机器人2 分钟前
《C++ STL 基础入门》教案
java·开发语言
java_t_t7 分钟前
集合工具类
java·集合
消失的旧时光-194312 分钟前
ScheduledExecutorService
android·java·开发语言
勇闯逆流河13 分钟前
【C++】用红黑树封装map与set
java·开发语言·数据结构·c++
码事漫谈24 分钟前
从外行到AI指挥官:你必须掌握的五大「程序员思维」
后端
Moonbit25 分钟前
MoonBit 开发者激励计划开启|赢取价值 $20 Copilot 月卡权益!
后端
码事漫谈27 分钟前
通信的三种基本模式:单工、半双工与全双工
后端
Q_Q51100828532 分钟前
python+uniapp基于微信小程序团购系统
spring boot·python·微信小程序·django·uni-app·node.js·php
前端中后台34 分钟前
如何防止短信验证码接口被盗刷
后端
SpiderPex34 分钟前
论MyBatis和JPA权威性
java·mybatis