过滤器和拦截器

过滤器和拦截器是Web开发中常用的两种技术,它们都扮演着请求和响应处理过程中的重要角色。尽管它们的目的相似,即对请求进行拦截和处理,但它们在实现方式、使用场景以及控制粒度上存在差异。

过滤器(Filter):JavaWeb的守门人

在JavaWeb领域,过滤器是一种运行在请求进入Servlet之前和响应发送给客户端之前的组件。它主要用于处理HTTP请求和响应的预处理和后处理。

过滤器的关键作用:

  1. 预处理与后处理: 过滤器可以在请求到达Servlet之前或响应被发送给客户端之前执行操作,如日志记录、权限控制、字符编码转换、数据压缩等。
  2. 增强HTTP请求和响应: 通过对请求和响应的处理,过滤器可以实现对它们的控制和增强。
  3. 统一处理逻辑: 过滤器能够在应用程序中实现统一的请求和响应处理逻辑,提升代码的复用性和可维护性。
实践中的过滤器:使用Filter接口

1、继承Filter接口

Filter接口有3个方法,但只有 doFilter() 未被实现,我们只需要实现该方法即可

public class Test01Filter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 自定义处理逻辑
        // 放行:chain.doFilter(request, response);
    }
}

2、配置过滤器(Filter)拦截路径 

  • 使用注解的方式

    filterName:过滤器名称servletNames:指定对哪些servlet进行过滤asyncSupported:是否支持异步模式urlPatterns  / value:指定拦截路径,作用相同,只能使用一个

  • 配置文件的方式

    <filter>
        <filter-name>test01Filter</filter-name>
        <filter-class>com.xxx.lurenjia.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>test01Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

拦截器(Interceptor):Spring MVC的调度员

在Spring MVC框架中,拦截器用于在处理器执行前后以及完成请求处理后进行拦截处理。

拦截器的主要职责:

  1. 请求预处理与后处理: 实现日志记录、权限校验、请求数据预处理、国际化等功能。
  2. 细粒度控制: 拦截器专为Spring MVC设计,提供了对请求的更细粒度控制。
  3. 灵活配置: 可以全局配置或针对特定的Controller配置拦截器。

1、创建自定义的拦截器

方式一:实现 HandlerInterceptor 接口preHandle():调用控制器类的请求处理方法之前执行,返回一个boolean类型,如果返回值是true,会继续执行后面的流程,否则,中断流程执行postHandle():在调用请求处理方法之后,把请求转发给视图之前执行afterCompletion():视图主键执行完毕,把响应结果返回给客户端之前执行

方式二:继承 HandlerInterceptorAdapter 适配器类 HandlerInterceptorAdapter类实现了HandlerInterceptor接口,但并为做任何处理,都是一些空方法,仅仅是为了简化开发

public class MyInterceptor implements HandlerInterceptor {
    // 在Controller方法执行前调用
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 返回true继续流程,返回false中断执行
        return true;
    }
    // 在Controller方法执行后调用
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 后处理逻辑
    }
    // 在完成请求处理后调用
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 清理资源等
    }
}

2、配置拦截器

<mvc:interceptors>
    <!-- 配置拦截器,可以有多个 -->
    <mvc:interceptor>
        <!-- 配置拦截器所拦截的url -->
        <mvc:mapping path="/test" />  <!-- 会拦截 /test 请求,/** 指拦截所有请求
    <mvc:exclude-mapping path="/login" />  <!-- 配置不需要拦截的路径 -->

        <bean class="xxx.拦截器类">
 <mvc:interceptor>
</mvc:interceptors>


原文始发于微信公众号(代码之旅):过滤器和拦截器

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/203663.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!