SpringMVC框架如何定义拦截器呢?

112 阅读2分钟

SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆等操作。

SpringMVC 拦截器的定义方式 实现接口 继承适配器 案例实操 实现接口 实现 HandlerInterceptor 接口方式定义我们的拦截器代码如下:

public class MyInterceptor implements HandlerInterceptor{

/** 

* preHandle 在请求方法拦截前执行 

* 返回 true 代表对当前请求进行放行处理 

*/ 

@Override 

public boolean preHandle(HttpServletRequest request, 

    HttpServletResponse response, Object handler) throws Exception { 

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

    return true; //继续执行 action 

} 

/** 

* 请求执行后,生成视图前执行 

*/ 

@Override 

public void postHandle(HttpServletRequest request, 

    HttpServletResponse response, Object handler, 

    ModelAndView modelAndView) throws Exception { 

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

} 

/** 

* 在请求方法执行后进行拦截 

*/ 

@Override 

public void afterCompletion(HttpServletRequest request, 

    HttpServletResponse response, Object handler, Exception ex) 

    throws Exception { 

    	System.out.println("方法执行后进行拦截。。释放资源。。。"); 

} 

} 对应配置有两种方式:

配置方式一(拦截所有请求配置方式):

mvc:interceptors

<!-- 使用 bean 定义一个 Interceptor 

直接定义在 mvc:interceptors 根下面的 Interceptor 将拦截所有的请求 --> 

<bean class="com.xxx.interceptors.MyInterceptor" /> 

</mvc:interceptors> 配置方式二(拦截指定请求配置方式)

mvc:interceptors

mvc:interceptor

<mvc:mapping path="/test/*.do" /> 

	<bean class="com.xxx.interceptors.MyInterceptor" /> 

</mvc:interceptor> 

</mvc:interceptors> 效果:

请求地址: http://localhost:8080/springmvc03/test/hello.do

控制台打印结果信息:

多个拦截器配置(多个拦截器组成一个拦截器链 ,栈式结构 123 321 退出):

mvc:interceptors

<mvc:interceptor> 

    <!-- 拦截所有请求 --> 

    <mvc:mapping path="/**" /> 

        <bean class="com.xxx.interceptors.MyInterceptor" /> 

</mvc:interceptor> 

<mvc:interceptor> 

    <!-- 拦截所有请求 --> 

    <mvc:mapping path="/**" /> 

    <bean class="com.xxx.interceptors.MyInterceptor2" /> 

</mvc:interceptor> 

</mvc:interceptors> 继承适配器 继承 HandlerInterceptorAdapter 方式定义拦截器(实际上最终还是 HandlerInterceptor 接口实现)

public class MyInterceptor2 extends HandlerInterceptorAdapter{

/** 
* 重写 preHandle 请求执行前执行 
*/ 

@Override 

public boolean preHandle(HttpServletRequest request, 

    HttpServletResponse response, Object handler) throws Exception { 

    System.out.println("请求前执行。。。"); 

    return true; 

} 

} 扩展 使用拦截器完成用户是否登录请求验证拦截器定义:

public class LoginInterceptor implements HandlerInterceptor{

/** 

* 方法拦截前执行 

*/ 

@Override 

public boolean preHandle(HttpServletRequest request, 

HttpServletResponse response, Object handler) throws Exception { 

	User user= (User) request.getSession().getAttribute("user"); 

    /** 

    * 判断 uri 是否包含路径 

    * 包含就放行 

    */ 

    if(request.getRequestURI().indexOf("userLogin.do")>-1){ 

    	return true; 

}  

    /** 

    * 判断 session user 是否为空 

    */ 

    if(null==user){ 

    response.sendRedirect(request.getContextPath()+"/login.jsp"); 

    return false; 

    } 

	return true; //继续执行 action 

} 

@Override 

public void postHandle(HttpServletRequest request, 

HttpServletResponse response, Object handler, 

ModelAndView modelAndView) throws Exception { 

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

} 

/** 

* 在方法执行后进行拦截 

*/ 

@Override 

public void afterCompletion(HttpServletRequest request, 

HttpServletResponse response, Object handler, Exception ex) 

throws Exception { 

	System.out.println("方法执行后进行拦截。。释放资源。。。"); 

} 

} UserController 类

/**

*

* @author Administrator

* 模拟 用户操作

*/

@Controller

@RequestMapping("/user")

public class UserLoginController {

@RequestMapping("/userLogin") 

public ModelAndView userLogin(HttpServletRequest request){ 

    ModelAndView mv=new ModelAndView(); 

    User user=new User(); 

    user.setUserName("xxx"); 

    user.setUserPwd("123456"); 

    request.getSession().setAttribute("user", user); 

    mv.setViewName("success"); 

    return mv;  

} 

@RequestMapping("/addUser") 

public ModelAndView addUser(){ 

    System.out.println("添加用户记录。。。"); 

    ModelAndView mv=new ModelAndView(); 

    mv.setViewName("success"); 

    return mv; 

} 

@RequestMapping("/delUser") 

public ModelAndView delUser(){ 

    ModelAndView mv=new ModelAndView(); 

    mv.setViewName("success"); 

    return mv; 

} 

@RequestMapping("/updateUser") 

public ModelAndView updateUser(){ 

    ModelAndView mv=new ModelAndView(); 

    mv.setViewName("success"); 

    return mv; 

}

} 拦截器 xml 配置

mvc:interceptors

<mvc:interceptor> 

    <mvc:mapping path="/**" /> 

    <bean class="com.xxx.interceptors.LoginInterceptor" /> 

</mvc:interceptor> 

</mvc:interceptors>