过滤器与拦截器

本文详细介绍了Servlet的Filter和Spring MVC的Interceptor的区别与应用场景。Filter主要用于web请求的预处理和响应后处理,如编码设置、权限验证,而Interceptor则用于Spring MVC中处理请求和响应,如权限检查和日志记录。两者都采用责任链模式,但执行顺序和使用场景不同,Filter在Servlet之前和之后执行,Interceptor则在Controller前后操作。Filter属于Servlet规范,Interceptor基于Spring框架。
摘要由CSDN通过智能技术生成

一. 概念认知

Filter:Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

Interceptor:Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

二. 快速入门

如何使用Filter:
1. 新建一个类,实现Filter接口
2. 实现其中的doFilter()方法,打印一句话,来证明能够进行拦截
3. 在web.xml中进行配置(参照Servlet配置)

public class Demo1Filter implements Filter {
   

    private FilterConfig filterConfig;

    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化了");
        this.filterConfig = filterConfig;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Demo1过滤前");
        System.out.println(filterConfig.getInitParameter("param1"));
        chain.doFilter(request, response);//放行。让其走到下个链或目标资源中
        System.out.println("Demo1过滤后");
    }

    public void destroy() {
        System.out.println("销毁了");
    }
}

web.xml

    <!--配置过滤器-->
    <filter>
        <!--用于添加描述信息,该元素的内容可为空,可以不配置。-->
        <!--<description>这是一个filter</description>-->
        <!--用于为过滤器指定一个名字,该元素的内容不能为空。-->
        <filter-name>FilterDemo01</filter-name>
        <!--用于指定过滤器的完整的限定类名。-->
        <filter-class>com.taolunban.filter.Demo1Filter</filter-class>
        <!--用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么<init-param>元素可以不配置。-->
        <init-param>
            <param-name>param1</param-name>
            <param-value>value在这里呢</param-value>
        </init-param>
    </filter>

    <!--映射过滤器-->
    <!--用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径-->
    <filter-mapping>
    <!--用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字-->
        <filter-name>FilterDemo01</filter-name>
        <!--设置 filter 所拦截的请求路径(过滤器关联的URL样式)。“/*”表示拦截所有的请求 -->
        <url-pattern>/*</url-pattern>
        <!--指定过滤器所拦截的Servlet名称-->
        <!--<servlet-name>ProductServlet</servlet-name>-->
        <!--有例子说还有一个disptcher的标签,查了一下,是servlet2.4加进去的,我用的是3.0,似乎已经去掉了这个标签 -->
    </filter-mapping>

如何使用Interceptor:
1. 定义Interceptor实现类,可以实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类
2. 实现其中的preHandle,postHandle和afterCompletion方法
3. 在spring配置文件中进行配置(不是springmvc配置文件)

public class DemoInterceptor extends HandlerInterceptorAdapter {
   

    /**
     * 在业务处理器处理请求之前被调用
     * 如果返回false
     *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
     * 如果返回true
     *    执行下一个拦截器,直到所有的拦截器都执行完毕
     *    再执行被拦截的Controller
     *    然后进入拦截器链,
     *    从最后一个拦截器往回执行所有的postHandle()
     *    接着再从最后一个拦截器往回执行所有的afterCompletion()
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        System.out.println("==============执行顺序: 1、preHandle================");
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());

        System.out.println("requestUri:"+requestUri);
        System.out.println("contextPath:"+contextPath);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值