springMVC教程--拦截器详解

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

内容简介: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教程--拦截器详解


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

查看所有标签

猜你喜欢:

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

大数据经济

大数据经济

谢文 / 北京联合出版公司·后浪出版公司 / 2016-1 / 32.00元

中国互联网数朝元老、中国的“凯文·凯利”首度深度剖析大数据的大机会 大数据纳入中国国家行动方略,大数据产业起飞在即 陈彤、胡舒立、王巍鼎力推荐 ................... ※编辑推荐※ ★ 雅虎中国前总裁、中国互联网第一预言家——谢文,首部大数据力作。本书作者是中国互联网业第一代创业者,历任和讯网总裁、雅虎中国总裁、一起网CEO,亲身经历中国互联网发展全过......一起来看看 《大数据经济》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具