首页 > 代码库 > SpringMVC经典系列-14自定义SpringMVC的拦截器---【LinusZhu】

SpringMVC经典系列-14自定义SpringMVC的拦截器---【LinusZhu】

      注意:此文章是个人原创,希望有转载需要的朋友们标明文章出处,如果各位朋友们觉得写的还好,就给个赞哈,你的鼓励是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linuszhu@163.com,敬请朋友们斧正,谢谢。

      这部分主要讲解SpringMVC的拦截器的部分,会带着大家完成定义拦截器的两种方式的实例,不多说了,开始……

      SpringMVC的拦截器主要是用于拦截用户的请求,并且进行相应的处理,如:权限验证、判断登录等。

定义拦截器的两种方式,如下:

1. 实现接口:

org.springframework.web.servlet.HandlerInterceptor

接口中有如下方法需要重写:

注意:参数中的Object handler是下一个拦截器。

a) public boolean preHandle
(HttpServletRequest request,HttpServletResponse response, 
Object handler) throws Exception

该方法在action执行前执行,可以实现对数据的预处理,比如:编码、安全控制等。

如果方法返回true,则继续执行action

b) public void postHandle
(HttpServletRequest request,HttpServletResponse response, 
Object handler,ModelAndView modelAndView) throws Exception

该方法在action执行后,生成视图前执行。在这里,我们有机会修改视图层数据。

c) public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception

最后执行,通常用于释放资源,处理异常。我们可以根据ex是否为空,来进行相关的异常处理。因为我们在平时处理异常时,都是从底层向上抛出异常,最后到了spring框架从而到了这个方法中。

2. 继承适配器类:

org.springframework.web.servlet.handler.HandlerInterceptorAdapter

这个适配器实现了HandlerInterceptor接口。提供了这个接口中所有方法的空实现。

下面是我定义的两中实现拦截器的示例代码,仅供大家参考:

//方式1

package 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 void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("zxs-最后执行!!!一般用于释放资源!!");

}

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("zxs-Action执行之后,生成视图之前执行!!");

}

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

System.out.println("zxs-action之前执行!!!");

return true; // 继续执行action

}

}

//方式2

package interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class MyInterceptor2 extends HandlerInterceptorAdapter {

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

System.out.println("MyInterceptor2.preHandle()");

return true; // 继续执行action

}

}

3. springmvc-servlet.xml中如何添加如下配置,使用拦截器:

<mvc:interceptors>

<!-- 拦截器1会拦截所有.do请求 -->

<bean class="interceptor.MyInterceptor"></bean>

<!-- 拦截器2会拦截user.do请求 -->

<mvc:interceptor>

    <mvc:mapping path="/user.do" />

<bean class="interceptor.MyInterceptor2"></bean>

</mvc:interceptor>

</mvc:interceptors>