拦截器和过滤器的区别

  拦截器和过滤器是SpringMVC中常用的两种实现请求处理链的方式,它们在实现方式和功能上有一些区别。

  拦截器(HandlerInterceptor)是SpringMVC提供的一种面向切面编程的机制,主要用于在请求处理的前后执行一些公共的处理逻辑,比如权限验证、日志记录等。拦截器是通过实现HandlerInterceptor接口来实现的,一般需要实现preHandle、postHandle和afterCompletion等方法,分别在请求处理的前、后和完成后执行。拦截器只能对请求的处理程序(Controller或Handler)进行拦截,不能对静态资源进行拦截。

  过滤器(Filter)是JavaEE中的一种标准规范,主要通过doFilter方法来实现对请求和响应进行处理。过滤器可以对请求进行预处理,也可以对响应进行后处理,可以拦截静态资源的请求。过滤器是通过实现javax.servlet.Filter接口来实现的,需要实现doFilter方法,在该方法中可以对请求和响应进行处理。过滤器的配置是在web.xml文件中进行。

  总结,拦截器主要用于拦截处理程序的请求,并在请求处理前后进行一些通用的处理逻辑,而过滤器主要用于对请求和响应进行处理和拦截,可以拦截静态资源的请求。在实现方式上,拦截器是基于SpringMVC框架的,过滤器是基于JavaEE标准的。

  具体实现方式如下:

  1. 拦截器的实现方式:
    - 创建一个类实现HandlerInterceptor接口,并实现preHandle、postHandle和afterCompletion方法;
    - 在Spring配置文件中配置拦截器,并指定需要拦截的URL路径。

  2. 过滤器的实现方式:
    - 创建一个类实现javax.servlet.Filter接口,并实现doFilter方法;
    - 在web.xml文件中配置过滤器,指定需要过滤的URL路径。

  以下是一个示例代码:

  拦截器实现方式:

复制代码
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前执行的逻辑
        return true; // 返回true表示继续执行后续处理,返回false表示中断请求处理
    }

    @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 {
        // 在整个请求处理完成之后执行的逻辑
    }
}
复制代码

  过滤器实现方式:

复制代码
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 过滤器初始化逻辑
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 请求处理逻辑
        chain.doFilter(request, response); // 继续执行后续过滤器或请求处理
        // 响应处理逻辑
    }

    @Override
    public void destroy() {
        // 过滤器销毁逻辑
    }
}
复制代码

  web.xml配置:

复制代码
<!-- 配置拦截器 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!-- 需要拦截的URL路径 -->
        <bean class="com.example.MyInterceptor"/> <!-- 拦截器实现类 -->
    </mvc:interceptor>
</mvc:interceptors>

<!-- 配置过滤器 -->
<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern> <!-- 需要过滤的URL路径 -->
</filter-mapping>
复制代码
posted @   凉冰24  阅读(205)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示