【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码

拦截器、过滤器与全局配置

在 Spring Boot 项目中,拦截器(Interceptor)、过滤器(Filter)与全局配置共同构成了请求处理链路中的关键环节。合理使用它们,可以在不侵入业务代码的前提下完成登录校验、日志记录、跨域处理、参数清洗等通用逻辑。

1. 过滤器(Filter)

过滤器是 Servlet 规范中的组件,作用于请求进入 Servlet 之前与响应返回之后,适合处理与协议层相关的通用逻辑。

java 复制代码
@Component
public class RequestLogFilter implements Filter {

    private static final Logger log = LoggerFactory.getLogger(RequestLogFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        long start = System.currentTimeMillis();
        chain.doFilter(request, response);
        long cost = System.currentTimeMillis() - start;
        log.info("请求处理耗时:{} ms", cost);
    }
}

2. 拦截器(Interceptor)

拦截器是 Spring MVC 提供的组件,作用于 Controller 方法调用前后,可以拿到 HandlerMethod,适合做权限校验、参数校验、接口幂等等业务级逻辑。

java 复制代码
@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String token = request.getHeader("Authorization");
        if (token == null || token.isEmpty()) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        // 这里可以解析 token、校验用户身份
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 请求处理完成后、视图渲染前执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
                                Exception ex) throws Exception {
        // 整个请求结束后执行,适合释放资源、记录日志
    }
}

3. 全局配置类

通过实现 WebMvcConfigurer,可以统一注册拦截器、配置跨域、静态资源映射等。

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Resource
    private AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authInterceptor)
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login", "/api/register");
    }

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

4. 过滤器与拦截器的区别

对比项 过滤器(Filter) 拦截器(Interceptor)
规范来源 Servlet 规范 Spring MVC 规范
作用范围 所有请求,包括静态资源 仅作用于 Controller 方法
依赖容器 依赖 Servlet 容器 依赖 Spring 容器,可注入 Bean
执行时机 请求进入 Servlet 之前 Controller 方法调用前后
典型场景 编码处理、跨域、日志 登录校验、权限控制、幂等校验

5. 全局异常处理

配合 @RestControllerAdvice 可以统一处理业务异常,避免在每个 Controller 中重复编写 try-catch。

java 复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public ResponseEntity<Result<Void>> handleBusinessException(BusinessException e) {
        return ResponseEntity.ok(Result.fail(e.getCode(), e.getMessage()));
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Result<Void>> handleException(Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                .body(Result.fail(500, "系统繁忙,请稍后重试"));
    }
}

通过以上组合,可以在项目中形成「过滤器做协议层处理 → 拦截器做业务层校验 → 全局异常处理兜底」的完整请求链路,让业务代码保持简洁、职责清晰。

6. CORS 跨域设置

前后端分离架构下,前端与后端往往部署在不同域名或端口,浏览器会触发跨域请求。Spring Boot 提供了多种方式配置 CORS(Cross-Origin Resource Sharing),下面介绍几种常用方案。

6.1 全局配置类方式

在 WebConfig 中重写 addCorsMappings 方法,统一配置跨域规则,适合全局生效的场景。

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOriginPatterns("http://localhost:8080", "https://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

6.2 注解方式

在具体的 Controller 或方法上使用 @CrossOrigin 注解,适合局部开启跨域的场景。

java 复制代码
@RestController
@RequestMapping("/api/user")
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
public class UserController {

    @GetMapping("/info")
    public Result<UserInfo> getUserInfo() {
        // 业务逻辑
        return Result.success(userInfo);
    }
}

6.3 过滤器方式

通过自定义 Filter 手动设置响应头,适合需要精细控制响应头的场景。

java 复制代码
@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "*");
        res.setHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
            res.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        chain.doFilter(request, response);
    }
}

6.4 配置注意事项

  • allowedOriginPatterns 支持通配符,如 "*" 表示允许所有来源;但开启 allowCredentials(true) 时,"*" 通配符会被浏览器拒绝,需明确指定来源。
  • OPTIONS 预检请求需要被正确处理,否则跨域请求会失败。
  • 生产环境建议将 allowedOriginPatterns 限定为实际的前端域名,避免安全风险。
  • 若同时配置了过滤器与拦截器,需注意 CORS 响应头在过滤器阶段就要写入,否则拦截器校验可能拿不到跨域信息。

通过以上方式,可以灵活地为项目配置 CORS 跨域策略,满足前后端分离开发与部署的需求。

相关推荐
开开心心就好1 小时前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先
鱼宵1 小时前
Spring AI RAG 问答助手:回答带引用,AI 不再睁眼说瞎话
java·人工智能·spring·springai
代码猎人1 小时前
怎么开发一个微信小程序
前端
薛定猫AI1 小时前
【技术干货】基于本地优先架构的开源AI智能体Octopus系统设计与实战解析
python·机器学习·ai·大模型·技术实战
console.log('npc')1 小时前
第 3 章 工程化与项目初始化
前端·人工智能·大模型
rannn_1111 小时前
项目缓存实战:热点 Key 击穿、缓存穿透与多级缓存架构
java·缓存·架构
CVer儿1 小时前
起源引擎harmmer++ 配置
开发语言
掘金者阿豪1 小时前
数据集成软件不能只看“同步成功”:聊聊金仓 KFS 和订单数据同步这件事
前端·后端
星夜离尘561 小时前
MATLAB FFT 单边幅度谱:归一化、奇偶长度与频谱泄漏的完整实验
开发语言·matlab·信号处理·频谱分析·fft