spring mvc 拦截器

来源:互联网 发布:上虞用友软件 编辑:程序博客网 时间:2024/04/29 18:21
Spring MVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。
在Spring MVC中定义拦截器主要有两种方式:
    1、拦截器类实现了Spring的HandlerInterceptor接口,或者是该类继承了实现HandlerInterceptor接口的类,比如HandlerInterceptorAdapter,该                        类是为了选择性的实现HandlerInterceptor中定义的三个方法;
    2、实现Spring的WebRequestInterceptor接口,或者是继承了实现WebRequestInterceptor接口的类

拦截器实现拦截功能的步骤:
HandlerInterceptor接口中定义了三个方法,通过这三个方法实现对请求进行拦截处理。
  1. preHandle(HttpServletRequest request,HttpServletResponse response,Object handle)方法,该方法在请求处理之前调用。一个请求中可以有多个Interceptor,按照申明顺序执行,最先执行的都是perHandle()方法。该方法主要是进行一些前置的初始化操作,也可以在此方法中判断请求要不要继续进行下去。该方法返回boolean类型,如果返回true,则继续调用下一个Interceptor的preHandle()方法,如果是最后一个Interceptor,则会调用请求的controller;如果返回false,请求结束,后续的Interceptor和Controller都不会再执行。
  2. postHandle(HttpServletRequest request,HttpServletResponse response,Object handle,ModelAndView modelAndView)方法,该方法是在当前Interceptor的preHandle()方法返回true时才被调用。此方法是在当前请求处理之后,即Controller调用之后再执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用。此方法被调用的方向跟preHandle()方法是相反的,即先声明的Interceptor的postHandle()方法反而会后执行。和Struts2的Interceptor执行过程相似,Struts2需手动调用ActionInvocation的invoke方法来触发对下一个Interceptor或Action的调用,然后每一个Interceptor中在Invoke方法调用之前的内容都是按申明顺序执行的,而invoke之后的内容是反向的。
  3. afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handle,Exception ex)方法,此方法也是需要当前对应的Interceptor的preHandle方法返回true时才被执行。此方法在整个请求结束之后,即DispactcherServlet渲染了对应的视图之后执行,主要作用是进行资源清理。

使用mvc:interceptors标签来申明需要加入到SpringMvc的拦截器主要有两种方式:
    1、直接定义一个Interceptor实现类的bean对象。使用这种方式申明的Interceptor拦截器将会对所有的请求进行拦截。
    2、使用mvc:interceptor标签进行申明,使用这种方式定义的Interceptor可以通过mvc:mapping子标签来定义需要进行拦截的请求路径。

    <mvc:interceptors>
             //方式一
            <bean  class = "com.bis.interceptor.AllInterceptor" />
             //方式二
            <mvc:interceptor>
                    <mvc:mapping  path = "/test/number.do" />
                    <bean  class = "com.bis.interceptor.LloginInterceptor"  />
            </mvc:interceptor>
    </mvc:interceptors>

    映射路劲说明:<mvc:mapping path="/*" />这个不是拦截所有的请求,而是拦截根目录下的第一级请求。












1 0
原创粉丝点击