SpringMVC的Interceptor

总结一下SpringMVC的Interceptor.


                  ```先来看一下SpringMVC的拦截器```

public class InterceptorDemo implements HandlerInterceptor {

    /**
     * 预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);
     * 返回值:true表示继续流程(如调用下一个拦截器或处理器);
     * false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
     * 其中这里的参数Handler 传过来的是当前拦截的方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        return false;
    }

    /**
     * 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)
     * 对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    /**
     * 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-
     * catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

在springMVC配置文件中配置一下Interceptor

<!-- 配置一个Interceptor -->
    <mvc:interceptors>
        <bean class="com.lyc.Interceptor.InterceptorDemo" />
    </mvc:interceptors>

具体的流程可以去关注一下DispatcherServlet内部到底是如何工作的,这里就不详细讲解了。


下面是通过代码观察Interceptor和Filter的区别


先实现一个简单的过滤器

public class FilterDemo implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("这里是初始化过滤器!");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        System.out.println("这里是执行过滤器!");
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("这里是摧毁过滤器!");
    }

}

并在web.xml文件中简单的配置一下

<filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.lyc.Filter.FilterDemo</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

结果:
 运行JSP时
当我点提交按钮之后可以看到:
这里写图片描述


综上可以看出很重要的一点:
1. 过滤器Filter是最先执行的,过后才是拦截器Interceptor。
2. PreHandler方法是执行在Controller方法之前的。
加上一点大神们的总结:
过滤器和拦截器的区别:
  ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
Spring的拦截器与Servlet的Filter都是起到了一个拦截请求作用,都是Aop的编程思想。只是二者的作用范围不一样
Filter是作用与Web程序中,然后Spring的Interceptor可以作用除Web程序之外的一些应用。(这一点可以通过看配置文件看出来。)并且Filter是在Servlet容器中的,然而Spring的Interceptor是作用于Spring容器中的。


感谢@开涛大神,@Java我人生-陈磊兴@大牛们的博客
有问题欢迎留言指点我这个菜鸡小白。
完。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值