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教程--拦截器详解


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

查看所有标签

猜你喜欢:

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

图解CSS3

图解CSS3

廖伟华 / 机械工业出版社 / 2014-7-1 / CNY 79.00

本书是CSS3领域的标准性著作,由资深Web前端工程师根据CSS3的最新技术标准撰写。内容极为全面、丰富和翔实,由浅入深地讲解了CSS3新特性的语法、功能和使用技巧,涵盖选择器、边框、背景、文本、颜色、UI、动画、新型盒模型、媒体查询、响应式设计等各种模块;写作方式创新,有趣且易懂,用图解的方式来描述CSS3的每一个特性甚至每一个步骤都配有实战效果图;包含大量案例,实战性强,每个特性都有作者从实践......一起来看看 《图解CSS3》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码