Filter过滤器和SpringMVC拦截器

Filter使用方法

//定义一个自己的过滤器,实现Filter接口
public class MyFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        //在请求之前进行过滤
        System.out.println("before");
        //返回过滤器链,继续通过下一个过滤器
        //如果此处不想继续执行,可以直接return,不用继续doFilter
        chain.doFilter(req, res);
        //请求结束之后
        System.out.println("after");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

<!-- web.xml配置文件,配置filter和filter-mapping,name要对应 -->
<!-- 可以配置多个filter-mapping,只需要name与filter对应即可 -->
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

结果这里写图片描述

SpringMvc拦截器使用方法

//实现HandlerInterceptor,需要实现三个方法
//也可以继承HandlerInterceptorAdapter,preHandle默认返回true
//根据需要重写自己的方法
public class MyInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("视图渲染后");
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("请求处理后,视图渲染前");
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
        System.out.println("请求处理前");
        return true;
        }
    }

配置文件的配置
<mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截路径,这里表示拦截所有 -->
            <mvc:mapping path="/**" />
            <bean class="cn.edu.hbue.soft.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

结果这里写图片描述

以下引用https://www.cnblogs.com/panxuejun/p/7715917.html

这里写图片描述
这里写图片描述

Filter可以拦截所有请求,在请求前后进行处理
Interceptor只能拦截经过前端控制器的请求,在具体的controller前后进行处理,只要一个pre返回true了,直接到after

Filter基于回调,Interceptor基于反射

这里写图片描述
这就是基于回调,这里的Code1和Code2实际上就是自己写的拦截器的doFilter
Chain.doFilter调用MyFitler.doFilter,然后MyFilter.doFilter反过来又调用Chain.doFilter
在这个过程中执行了service方法

猜你喜欢

转载自blog.csdn.net/a1065712890/article/details/80597224