SpringMVC:详述拦截器

将堆内存SpringMVC使用拦截器对请求进行拦截处理,以实现特定的功能:

具体实现:

1、自定义一个实现HandlerInterceptor接口的类并实现接口中定义的抽象方法(实现了三个方法,分别处理Handler Method方法执行前、执行后以及渲染视图后的操作)

package com.zzj.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
     //该方法在Handler Method之前被调用
     
//作用:常用于实现权限
        System.out.println("preHandle");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
     //该方法在Handler Method之后,渲染视图之前
     //
常用于对请求域中的属性或视图做出修改
        System.out.println("postHandle");
        
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
     //该方法在渲染视图之后被调用

      //作用:常用于释放资源 

        System.out.println("afterCompletion");
    }
    
}

2、 配置拦截器

a、所有请求

<mvc:interceptors>
    <bean class="com.zzj.interceptor.MyInterceptor"></bean>
</mvc:interceptors>

b、特定请求

<mvc:interceptors>
    <mvc:interceptor>

      <!--

             mvc:exclude-mapping用于设置不拦截哪些路径的请求;mvc:mapping用于设置拦截哪些路径的请求,如下例子:

             /userinfo只拦截/userinfo请求,不拦截/userinfo/toView.do请求

             /userinfo/*拦截/userinfo/xxx请求

         -->

        <mvc:mapping path="/userinfo/*"/>
        <bean class="com.zzj.interceptor.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

 

拦截器的执行过程分析:

我们在发送一个请求后必定会执行DispatchServlet中的doDispatch方法,而在执行如下方法的顺序我们来分析一下:

 

preHandle方法(在Handler Method方法执行前调用。功能举例:校验、实现权限等)

 通过标蓝代码我们可以看到preHandle在Handler Method之前执行,

 mappedHandler.applyPreHandle(processedRequest, response)执行的也就是我们创建的拦截器里的preHandler方法,

我们可以在该方法里通过返回boolean的值来决定是打回请求(拒绝访问),还是继续执行之后的步骤。

 

 

postHandle方法(在Handler Method方法执行后,渲染视图前调用。功能举例:加签名,印章等)

 

 

标蓝部分即postHandlle的执行,可见他在Handler Method之后执行,而在processDispatchResult(该方法里将会进行视图渲染,详见下方法图)之前执行

 

 

afterCompletion方法在渲染视图之后被调用。功能举例:释放资源

 

 由上方法介绍可知,之后会执行processDispatchResult方法,我们找到该方法,可见render方法,该方法我们在自定义视图的博客中介绍过,是用来进行渲染视图的

在渲染视图后,才会执行afterCompletion方法

 

posted @ 2020-02-28 14:28  一梦先知  阅读(146)  评论(0编辑  收藏  举报