Spring MVC 中 HandlerInterceptorAdapter的使用(拦截器)
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。 Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。
Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
- return true;
- }
- public void postHandle(
- HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- throws Exception {
- }
- public void afterCompletion(
- HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- }
分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。
如果基于xml配置使用Spring MVC,
可以利用SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping进行Url映射(相当于struts的path映射)和拦截请求(注入interceptors),
如果基于注解使用Spring MVC,可以使用DefaultAnnotationHandlerMapping注入interceptors。
注意无论基于xml还是基于注解,HandlerMapping bean都是需要在xml中配置的。
一个demo:
在这个例子中,我们假设UserController中的注册操作只在9:00-12:00开放,那么就可以使用拦截器实现这个功能。
- public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
- private int openingTime;
- private int closingTime;
- private String mappingURL;//利用正则映射到需要拦截的路径
- public void setOpeningTime(int openingTime) {
- this.openingTime = openingTime;
- }
- public void setClosingTime(int closingTime) {
- this.closingTime = closingTime;
- }
- public void setMappingURL(String mappingURL) {
- this.mappingURL = mappingURL;
- }
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- String url=request.getRequestURL().toString();
- if(mappingURL==null || url.matches(mappingURL)){
- Calendar c=Calendar.getInstance();
- c.setTime(new Date());
- int now=c.get(Calendar.HOUR_OF_DAY);
- if(now<openingTime || now>closingTime){
- request.setAttribute("msg", "注册开放时间:9:00-12:00");
- request.getRequestDispatcher("/msg.jsp").forward(request, response);
- return false;
- }
- return true;
- }
- return true;
- }
- }
xml配置:
- <bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">
- <property name="openingTime" value="9" />
- <property name="closingTime" value="12" />
- <property name="mappingURL" value=".*/user\.do\?action=reg.*" />
- </bean>
- <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
- <property name="interceptors">
- <list>
- <ref bean="timeBasedAccessInterceptor"/>
- </list>
- </property>
- </bean>
这里我们定义了一个mappingURL属性,实现利用正则表达式对url进行匹配,从而更细粒度的进行拦截。当然如果不定义mappingURL,则默认拦截所有对Controller的请求。
UserController:
- @Controller
- @RequestMapping("/user.do")
- public class UserController{
- @Autowired
- private UserService userService;
- @RequestMapping(params="action=reg")
- public ModelAndView reg(Users user) throws Exception {
- userService.addUser(user);
- return new ModelAndView("profile","user",user);
- }
- // other option ...
- }
这个Controller相当于Struts的DispatchAction
你也可以配置多个拦截器,每个拦截器进行不同的分工.
转载于:https://www.cnblogs.com/lxaic/p/5851985.html
Spring MVC 中 HandlerInterceptorAdapter的使用(拦截器)相关推荐
- Spring MVC学习(8)—HandlerInterceptor处理器拦截器机制全解
基于最新Spring 5.x,详细介绍了Spring MVC的HandlerInterceptor处理器拦截器机制,以及它的一系列拦截方法. 本次我们来学习Sring MVC的HandlerInter ...
- SSM框架之Spring MVC(四)异常处理和拦截器实现
一.SpringMVC中的异常处理 1.1异常处理的思路 系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通 ...
- Spring MVC 中 HandlerInterceptorAdapter的使用--转载
原文地址:http://blog.csdn.net/liuwenbo0920/article/details/7283757 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可 ...
- Spring MVC 中 HandlerInterceptorAdapter过滤器的使用
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理.后处理. Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. ...
- Spring MVC 中 HandlerInterceptorAdapter的使用
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理.后处理. Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. s ...
- Spring MVC 中 HandlerInterceptorAdapter的使用 预处理、后处理、返回处理
一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理.后处理. Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度. S ...
- 【Spring MVC 中 HandlerInterceptorAdapter的使用】
接到这样一个需求:现有项目X,在我方的服务器A和客户的服务器B上均有部署.用户之前都是访问的A,现在要求所有用户的请求都转发到服务器B上去.考虑到用户可能保存了很多不同的网址(不止是主页网址),现写一 ...
- spring mvc中的拦截器
本文说下spring MVC中的拦截器 文章目录 拦截器介绍 拦截器注入适配器 自定义拦截器 controller测试 测试结果 本文小结 拦截器介绍 拦截器是在servlet执行之前执行的程序(这里 ...
- Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...
最新文章
- jquery内核学习(6)--扩展实现extend
- 使用文本文件(.txt)进行数据存取的技巧总结
- 5G商用将在“十三五”时期内启动
- GridView的多主键(Key)取值问题
- java客户端传递参数_java – 在客户端传递参数
- Shell教程(五):替代、引用机制、输入输出重定向
- 监听Hierachy、Project等视图结构变化的事件
- python执行adb命令_Python实现对adb命令封装
- android studio butterknife配置,!!!!在AndroidStudio中添加butterknife插件
- PostgreSQL11.7逻辑复制的搭建
- 搭建mediawiki开始知识共享
- 换个红圈1微信头像恶搞一下好友
- newton版本linux,centos7.4下安装部署openstack newton版本 互联网技术圈 互联网技术圈...
- hdu 3930 Broot 二次剩余
- 论述计算机辅助设计技术主要包括的内容,计算机辅助设计复习思考题
- spark数据清洗解决方案
- 万人规模互联网公司的企业IT基础架构概览
- 设计模式——备份模式
- 点我—— ASP.NETCORE 安装CentOS
- 在虚拟机上使用Ghost备份/恢复操作系统