springMVC教程--拦截器详解

栏目: Java · 发布时间: 8年前

内容简介:springMVC教程--拦截器详解

拦截器

3.1  定义

spring Web MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter ,用于对处理器进行预处理和后处理。

3.2  拦截器定义

实现 HandlerInterceptor 接口,如下:

Public class HandlerInterceptor1 implements HandlerInterceptor{  
  
   
  
/**  
  
 * controller执行前调用此方法  
  
 * 返回true表示继续执行,返回false中止执行  
  
 * 这里可以加入登录校验、权限拦截等  
  
 */  
  
@Override  
  
Public boolean preHandle(HttpServletRequest request,  
  
HttpServletResponse response, Object handler) throws Exception {  
  
// TODO Auto-generated method stub  
  
Return false;  
  
}  
  
/**  
  
 * controller执行后但未返回视图前调用此方法  
  
 * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示  
  
 */  
  
@Override  
  
Public void postHandle(HttpServletRequest request,  
  
HttpServletResponse response, Object handler,  
  
ModelAndView modelAndView) throws Exception {  
  
// TODO Auto-generated method stub  
  
}  
  
/**  
  
 * controller执行后且视图返回后调用此方法  
  
 * 这里可得到执行controller时的异常信息  
  
 * 这里可记录操作日志,资源清理等  
  
 */  
  
@Override  
  
Public void afterCompletion(HttpServletRequest request,  
  
HttpServletResponse response, Object handler, Exception ex)  
  
throws Exception {  
  
// TODO Auto-generated method stub  
  
}  
  
   
  
}  

3.3  拦截器配置

3.3.1 针对某种 mapping 配置拦截器

<bean  
  
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">  
  
<property name="interceptors">  
  
<list>  
  
<ref bean="handlerInterceptor1"/>  
  
<ref bean="handlerInterceptor2"/>  
  
</list>  
  
</property>  
  
</bean>  
  
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>  
  
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>  

3.3.2 针对所有 mapping 配置全局拦截器

   
  
<!--拦截器 -->  
  
<mvc:interceptors>  
  
<!--多个拦截器,顺序执行 -->  
  
<mvc:interceptor>  
  
<mvc:mapping path="/**"/>  
  
<bean class="com.sihai.springmvc.filter.HandlerInterceptor1"></bean>  
  
</mvc:interceptor>  
  
<mvc:interceptor>  
  
<mvc:mapping path="/**"/>  
  
<bean class="com.sihai.springmvc.filter.HandlerInterceptor2"></bean>  
  
</mvc:interceptor>  
  
</mvc:interceptors>  

3.4  正常流程测试

3.4.1 代码:

定义两个拦截器分别为: HandlerInterceptor1 HandlerInteptor2 ,每个拦截器的 preHandler 方法都返回 true

3.4.2 运行流程

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor2..postHandle..

HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..

HandlerInterceptor1..afterCompletion..

3.5  中断流程测试

3.5.1 代码:

定义两个拦截器分别为: HandlerInterceptor1 HandlerInteptor2

3.5.2 运行流程

HandlerInterceptor1 preHandler 方法返回 false HandlerInterceptor2 返回 true ,运行流程如下:

HandlerInterceptor1..preHandle..

从日志看出第一个拦截器的 preHandler 方法返回 false 后第一个拦截器只执行了 preHandler 方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且 controller 也不执行了。

HandlerInterceptor1 preHandler 方法返回 true HandlerInterceptor2 返回 false ,运行流程如下:

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor1..afterCompletion..

从日志看出第二个拦截器的 preHandler 方法返回 false 后第一个拦截器的 postHandler 没有执行,第二个拦截器的 postHandler afterCompletion 没有执行,且 controller 也不执行了。

总结:

preHandle 按拦截器定义顺序调用

postHandler 按拦截器定义逆序调用

afterCompletion 按拦截器定义逆序调用

postHandler 在拦截器链内所有拦截器返成功调用

afterCompletion 只有 preHandle 返回 true 才调用

3.6  拦截器应用

3.6.1 用户身份认证

Public class LoginInterceptorimplements HandlerInterceptor{  
  
   
  
@Override  
  
Public boolean preHandle(HttpServletRequest request,  
  
HttpServletResponse response, Object handler)throws Exception {  
  
   
  
//如果是登录页面则放行  
  
if(request.getRequestURI().indexOf("login.action")>=0){  
  
return true;  
  
}  
  
HttpSession session = request.getSession();  
  
//如果用户已登录也放行  
  
if(session.getAttribute("user")!=null){  
  
return true;  
  
}  
  
//用户没有登录挑战到登录页面  
  
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);  
  
return false;  
  
}  
  
}  
  
   

3.6.2 用户登陆 controller

//登陆页面  
  
@RequestMapping("/login")  
  
public String login(Model model)throws Exception{  
  
return "login";  
  
}  
  
//登陆提交  
  
//userid:用户账号,pwd:密码  
  
@RequestMapping("/loginsubmit")  
  
public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{  
  
//向session记录用户身份信息  
  
session.setAttribute("activeUser", userid);  
  
return "redirect:item/queryItem.action";  
  
}  
  
//退出  
  
@RequestMapping("/logout")  
  
public String logout(HttpSession session)throws Exception{  
  
//session过期  
  
session.invalidate();  
  
return "redirect:item/queryItem.action";  
  
}  

动动小手关注我的微信公众号吧 好好学java

springMVC教程--拦截器详解


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First JavaScript Programming

Head First JavaScript Programming

Eric T. Freeman、Elisabeth Robson / O'Reilly Media / 2014-4-10 / USD 49.99

This brain-friendly guide teaches you everything from JavaScript language fundamentals to advanced topics, including objects, functions, and the browser’s document object model. You won’t just be read......一起来看看 《Head First JavaScript Programming》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具