记录 JAVA跨域资源访问CORSFilter

Java跨域访问与CORSFilter
博客主要围绕Java跨域访问展开,涉及到CORSFilter。在Java开发中,跨域访问是常见问题,CORSFilter可有效解决该问题,保障系统正常运行。
@Configuration
public class CrosConfig {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        // 允许cookies跨域
        config.setAllowCredentials(true);
        // 允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
        config.addAllowedOrigin("*");
        // 允许访问的头信息,*表示全部
        config.addAllowedHeader("*");
        // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
        config.setMaxAge(18000L);
        // 允许提交请求的方法,*表示全部允许
        config.addAllowedMethod("*");
        config.addExposedHeader("x-auth-token");
        config.addExposedHeader("x-total-count");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

 

<think>好的,我需要解释Java过滤器和拦截器的区别。首先,我得回忆一下它们各自的作用和位置。过滤器属于Servlet规范,而拦截器是Spring框架中的概念。用户可能是在使用Spring MVC时遇到这两个概念,想了解它们的区别和应用场景。 接下来,我应该比较它们的实现接口和配置方式。过滤器需要实现javax.servlet.Filter接口,并在web.xml中配置或使用注解。拦截器则实现Spring的HandlerInterceptor接口,通常在Spring配置类中通过WebMvcConfigurer添加。 然后要考虑它们的执行顺序和作用范围。过滤器在请求进入Servlet容器前后执行,可以处理任何请求,包括静态资源。拦截器在DispatcherServlet处理之后,Controller方法执行前后介入,主要针对Controller的请求。 异常处理方面,过滤器无法获取到Controller的异常,而拦截器可以在afterCompletion方法中处理异常。这可能是用户关心的点,特别是在全局异常处理时。 依赖注入也是一个区别。拦截器作为Spring的组件,可以使用@Autowired注入其他Bean,而过滤器默认不行,除非使用Spring的代理方式。用户如果需要在过滤器中访问Spring管理的Bean,可能需要特别处理。 最后,应用场景的例子会有助于理解。比如日志记录、权限检查适合用拦截器,而编码设置、跨域处理适合用过滤器。需要确保例子具体,帮助用户选择合适的工具。 需要避免混淆两者的使用场景,比如修改请求参数可能更适合过滤器,而权限验证用拦截器更合适。同时,要提醒用户注意执行顺序,如果有多个过滤器或拦截器,配置顺序会影响实际效果。 总结时,分点列出它们的区别,结构清晰。可能还需要提到拦截器的三个方法:preHandle、postHandle、afterCompletion,而过滤器主要是doFilter方法。这样用户能更清楚它们的不同阶段。</think>--- ### **一、核心定位差异** | **特性** | **过滤器(Filter)** | **拦截器(Interceptor)** | |----------------|------------------------------------------|------------------------------------------| | **规范归属** | JavaEE Servlet规范(javax.servlet) | Spring框架特有机制 | | **作用层面** | Web容器层面(Tomcat/Jetty等) | Spring MVC框架层面 | | **依赖关系** | 不依赖Spring框架 | 必须整合Spring MVC | --- ### **二、执行时序对比** **HTTP请求完整处理流程**: ``` 客户端请求 → Web容器 → FilterChain(过滤器1 → 过滤器2 → ...) → Servlet → DispatcherServlet → Interceptor链(前置处理 → Controller → 后置处理 → 视图渲染 → 最终处理) → 响应客户端 ``` **关键时间节点**: 1. 过滤器`doFilter()`在DispatcherServlet**之前**执行 2. 拦截器`preHandle()`在Controller方法**调用前**执行 3. 拦截器`postHandle()`在Controller方法**返回后**、视图渲染前执行 4. 拦截器`afterCompletion()`在**请求完成**后执行(视图渲染完成) --- ### **三、配置方式对比** #### **过滤器配置** **XML配置示例**: ```xml <filter> <filter-name>encodingFilter</filter-name> <filter-class>com.example.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` **注解配置**: ```java @WebFilter(urlPatterns = "/*") public class AuthFilter implements Filter { // 过滤逻辑 } ``` #### **拦截器配置** **Spring Boot配置类**: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/static/**"); } } ``` --- ### **四、功能特性对比** | **能力维度** | 过滤器 | 拦截器 | |--------------------|-------------------------------------|---------------------------------| | **请求作用域** | 所有请求(包括静态资源) | 仅Spring管理的请求 | | **参数获取** | 可获取原始请求/响应对象 | 可获取HandlerMethod参数信息 | | **异常处理** | 无法获取Controller层异常 | 可通过afterCompletion捕获异常 | | **依赖注入** | 默认不支持(需特殊处理) | 天然支持Spring依赖注入 | | **执行粒度** | 粗粒度(请求/响应整体处理) | 细粒度(可获取处理方法元数据) | --- ### **五、典型应用场景** #### **过滤器适用场景** 1. 全局字符编码设置 ```java public void doFilter(...) { request.setCharacterEncoding("UTF-8"); chain.doFilter(request, response); } ``` 2. 跨域处理(CORS) 3. 敏感词过滤 4. 请求内容修改(包装HttpServletRequest) #### **拦截器适用场景** 1. 接口权限验证 ```java public boolean preHandle(...) { if (!checkToken(request)) { response.sendError(401); return false; } return true; } ``` 2. API接口日志记录 3. 接口耗时统计 4. 全局数据预处理 --- ### **六、深度技术对比** #### **1. 异常处理机制** - **过滤器**:无法直接处理Controller抛出的异常 - **拦截器**:通过`afterCompletion()`可捕获异常 ```java public void afterCompletion(...) { if(ex != null) { log.error("请求处理异常", ex); } } ``` #### **2. 参数处理能力** - **过滤器**:只能获取原始请求参数 - **拦截器**:可访问HandlerMethod参数元数据 ```java public boolean preHandle(...) { HandlerMethod method = (HandlerMethod) handler; RequestMapping annotation = method.getMethodAnnotation(RequestMapping.class); // 获取方法级别注解 } ``` #### **3. 性能影响** - 过滤器链在Web容器层面执行,性能损耗更低 - 拦截器经过Spring MVC处理栈,功能更丰富但开销略大 --- ### **七、组合使用最佳实践** **典型安全校验流程**: 1. **FilterChain**:处理跨域、字符编码 2. **Interceptor**:进行权限校验 3. **AOP**:业务层细粒度权限控制 **执行顺序配置要点**: ```java @Configuration public class SecurityConfig { @Bean public FilterRegistrationBean<Filter> corsFilter() { FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>(); bean.setFilter(new CorsFilter()); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 最高优先级 return bean; } } ``` --- ### **八、常见误区澄清** 1. **"拦截器是过滤器的升级版"** → 两者设计目的不同,属于互补关系 2. **"过滤器不能注入Spring Bean"** → 可通过FilterRegistrationBean包装实现依赖注入: ```java @Component public class CustomFilter implements Filter { @Autowired private AuthService authService; // 成功注入 } ``` 3. **"拦截器可以替代过滤器"** → 对于非Spring管理的资源(如静态文件),仍需使用过滤器 --- ### **总结选择策略** | **考虑因素** | 推荐方案 | |------------------------|-------------------------| | 需要处理静态资源 | 过滤器 | | 需要精细控制Controller | 拦截器 | | 需要最早介入请求处理 | 过滤器(配置最高优先级)| | 需要依赖Spring特性 | 拦截器 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值