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

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 class="com.xxx.interceptors.MyInterceptor" /> 
​
</mvc:interceptors> 

配置方式二(拦截指定请求配置方式)

[mvc:interceptors](mvc:interceptors)

<!-- 定义在 mvc:interceptor 下面 拦截所有 test 地址开头的请求-->

<mvc:interceptor> 
​
 <mvc:mapping path="/test/*.do" /> 
​
 <bean class="com.xxx.interceptors.MyInterceptor" /> 
​
 </mvc:interceptor> 
​
</mvc:interceptors> 

多个拦截器配置(多个拦截器组成一个拦截器链 ,栈式结构 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; 
​
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值