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


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

查看所有标签

猜你喜欢:

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

Web界面设计

Web界面设计

Bill Scott、Theresa Neil / 李松峰 / 电子工业出版社 / 2015-3 / 108.00

当前的Web已经进入崭新的时代!《Web界面设计》涵盖了在基于独一无二的Web环境下、在创建丰富体验的过程中设计Web界面的最佳实践、模式和原理。UI专家Bill Scott和Theresa Neil在他们多年实践经验和不懈探索的基础上,总结提炼出了Web界面设 计的六大原理——直截了当、简化交互、足不出户、提供邀请、巧用变换和即时反应,并以这六大原理为依托,以当今Web上各类开风气之先的流行网站......一起来看看 《Web界面设计》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

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

HSV CMYK互换工具