springMVC教程--拦截器详解

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

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


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

查看所有标签

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

社群营销与运营/互联网+新媒体营销规划丛书

社群营销与运营/互联网+新媒体营销规划丛书

秦阳//秋叶|总主编:秋叶 / 人民邮电出版社 / 2017-5 / 45.00元

《社群营销与运营》共分6章。第1章重点介绍了社群营销的起因、概念、构成、价值和评估模型,引导读者全面认识社群以及社群营销;第2章介绍了如何从无到有、从小到大建设一个社群的手法和注意事项;第3章重点介绍维持社群活跃度的各种技巧;第4章介绍了组织一场社群线下活动五个阶段的执行方案;第5章介绍了如何从无到有、由弱到强地构建社群运营团队;第6章介绍如何正确看待社群商业变现以及社群商业变现的三大模式和四个基......一起来看看 《社群营销与运营/互联网+新媒体营销规划丛书》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

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

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具