专业的JAVA编程教程与资源

网站首页 > java教程 正文

spring boot过滤器与拦截器的区别

temp10 2025-03-02 19:02:16 java教程 10 ℃ 0 评论

有小伙伴使用spring boot开发多年,但是对于过滤器和拦截器的主要区别依然傻傻分不清。今天就对这两个概念做一个全面的盘点。

定义与作用范围

  • 过滤器(Filter):过滤器是一种可以动态地拦截、处理和响应HTTP请求和响应的对象。它基于Servlet规范,可以拦截所有到达Web应用的请求,包括静态资源(如HTML、CSS、JavaScript文件等)和动态资源(如Servlet、JSP页面等)。过滤器主要用于请求的预处理和响应的后处理,如字符编码处理、URL访问记录等。
  • 拦截器(Interceptor):拦截器是Spring MVC框架中的一部分,它基于Spring框架的AOP(面向切面编程)思想。它主要拦截Controller层的方法调用,不会拦截对静态资源的请求。拦截器主要用于在请求处理的不同阶段(如请求进入控制器方法之前或之后)执行额外的逻辑操作,如权限检查、接口日志记录、异常处理等。

过滤器实例

定义过滤器:实现javax.servlet.Filter接口,并重写doFilter方法。

spring boot过滤器与拦截器的区别

注册过滤器:通过@WebFilter注解自动注册,或者使用FilterRegistrationBean在Spring配置类中注册。

import org.springframework.stereotype.Component;
 
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
@Component
public class SimpleCORSFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
 
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
 
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
 
    @Override
    public void init(FilterConfig filterConfig) {}
 
    @Override
    public void destroy() {}
}

上面代码定义了一的跨域资源共享(CORS)过滤器,用于处理跨域请求。它设置了允许的源、方法和头部,并处理预检请求,这个在开发中经常用到。

拦截器实例

定义拦截器:实现HandlerInterceptor接口,并重写preHandle方法。

@Component  
public class AuthInterceptor implements HandlerInterceptor {  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
            throws Exception {  
        // 获取用户信息,进行身份验证  
        // ...  
          
        // 如果用户未登录或权限不足,返回false并设置响应状态  
        if (!isUserAuthenticated(request)) {  
            response.setStatus(HttpServletResponse.FORBIDDEN);  
            return false;  
        }  
          
        // 用户已登录且权限足够,放行请求  
        return true;  
    }  
}

注册拦截器:在Spring配置类中注册拦截器,并指定拦截的路径和顺序。

@Configuration  
public class WebConfig implements WebMvcConfigurer {  
    @Autowired  
    private AuthInterceptor authInterceptor;  
      
    @Override  
    public void addInterceptors(InterceptorRegistry registry) {  
        registry.addInterceptor(authInterceptor).addPathPatterns("/**").excludePathPatterns("/login");  
    }  
}

上面代码主要实现一个权限检查拦截器,用于在请求进入控制器方法之前进行身份验证。

总结

作用范围

  • 过滤器拦截所有到达Web应用的请求(包括静态资源和动态资源)
  • 拦截器主要拦截Controller层的方法调用,不拦截静态资源

操作对象

  • 过滤器只能对请求(request)和响应(response)进行操作
  • 拦截器可以对请求(request)、响应(response)、处理器(handler)、模型视图(modelAndView)、异常(exception)等进行


每天一个小知识,每天进步一点点!!!

喜欢这类文章,请关注、点赞、收藏、转发,谢谢!!!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表