Spring的Interceptor(拦截器)是Controller 方法级别的 当某一个Controller的方法进行request处理的时候 可以通过Interceptor进行拦截, 拦截器可以在方法执行之前, 方法执行完以后(返回ModelAndView) 以及执行完整个流程(直到渲染完View) 进行拦截

Spring MVC allow you to intercept web request through handler interceptors. The handler interceptor have to implement the org.springframework.web.servlet.HandlerInterceptor interface, which contains three methods :

  1. preHandle() – Called before the handler execution, returns a boolean value, “true” : continue the handler execution chain; “false”, stop the execution chain and return it.
  2. postHandle() – Called after the handler execution, allow manipulate the ModelAndView object before render it to view page.
  3. afterCompletion() – Called after the complete request has finished. Seldom use, cant find any use case.

In this tutorial, you will create two handler interceptors to show the use of the HandlerInterceptor.

  1. ExecuteTimeInterceptor – Intercept the web request, and log the controller execution time.
  2. MaintenanceInterceptor – Intercept the web request, check if the current time is in between the maintenance time, if yes then redirect it to maintenance page.

Note
It’s recommended to extend the HandlerInterceptorAdapter for the convenient default implementations.

1. ExecuteTimeInterceptor

Intercept the before and after controller execution, log the start and end of the execution time, save it into the existing intercepted controller’s modelAndView for later display.

File : ExecuteTimeInterceptor.java

[java] view plaincopy
  1. package com.mkyong.common.interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import org.apache.log4j.Logger;
  5. import org.springframework.web.servlet.ModelAndView;
  6. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  7. public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter{
  8. private static final Logger logger = Logger.getLogger(ExecuteTimeInterceptor.class);
  9. //before the actual handler will be executed
  10. public boolean preHandle(HttpServletRequest request,
  11. HttpServletResponse response, Object handler)
  12. throws Exception {
  13. long startTime = System.currentTimeMillis();
  14. request.setAttribute("startTime", startTime);
  15. return true;
  16. }
  17. //after the handler is executed
  18. public void postHandle(
  19. HttpServletRequest request, HttpServletResponse response,
  20. Object handler, ModelAndView modelAndView)
  21. throws Exception {
  22. long startTime = (Long)request.getAttribute("startTime");
  23. long endTime = System.currentTimeMillis();
  24. long executeTime = endTime - startTime;
  25. //modified the exisitng modelAndView
  26. modelAndView.addObject("executeTime",executeTime);
  27. //log it
  28. if(logger.isDebugEnabled()){
  29. logger.debug("[" + handler + "] executeTime : " + executeTime + "ms");
  30. }
  31. }
  32. }

2. MaintenanceInterceptor

Intercept before the controller execution, check if the current time is in between the maintenance time, if yes then redirect it to maintenance page; else continue the execution chain.

File : MaintenanceInterceptor.java

[java] view plaincopy
  1. package com.mkyong.common.interceptor;
  2. import java.util.Calendar;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  6. public class MaintenanceInterceptor extends HandlerInterceptorAdapter{
  7. private int maintenanceStartTime;
  8. private int maintenanceEndTime;
  9. private String maintenanceMapping;
  10. public void setMaintenanceMapping(String maintenanceMapping) {
  11. this.maintenanceMapping = maintenanceMapping;
  12. }
  13. public void setMaintenanceStartTime(int maintenanceStartTime) {
  14. this.maintenanceStartTime = maintenanceStartTime;
  15. }
  16. public void setMaintenanceEndTime(int maintenanceEndTime) {
  17. this.maintenanceEndTime = maintenanceEndTime;
  18. }
  19. //before the actual handler will be executed
  20. public boolean preHandle(HttpServletRequest request,
  21. HttpServletResponse response, Object handler)
  22. throws Exception {
  23. Calendar cal = Calendar.getInstance();
  24. int hour = cal.get(cal.HOUR_OF_DAY);
  25. if (hour >= maintenanceStartTime && hour <= maintenanceEndTime) {
  26. //maintenance time, send to maintenance page
  27. response.sendRedirect(maintenanceMapping);
  28. return false;
  29. } else {
  30. return true;
  31. }
  32. }
  33. }

3. Enable the handler interceptor

To enable it, put your handler interceptor class in the handler mapping “interceptors” property.

[html] view plaincopy
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.springframework.org/schema/beans
  4. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  5. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  6. <property name="mappings">
  7. <props>
  8. <prop key="/welcome.htm">welcomeController</prop>
  9. </props>
  10. </property>
  11. <property name="interceptors">
  12. <list>
  13. <ref bean="maintenanceInterceptor" />
  14. <ref bean="executeTimeInterceptor" />
  15. </list>
  16. </property>
  17. </bean>
  18. <bean
  19. class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
  20. <property name="interceptors">
  21. <list>
  22. <ref bean="executeTimeInterceptor" />
  23. </list>
  24. </property>
  25. </bean>
  26. <bean id="welcomeController"
  27. class="com.mkyong.common.controller.WelcomeController" />
  28. <bean class="com.mkyong.common.controller.MaintenanceController" />
  29. <bean id="executeTimeInterceptor"
  30. class="com.mkyong.common.interceptor.ExecuteTimeInterceptor" />
  31. <bean id="maintenanceInterceptor"
  32. class="com.mkyong.common.interceptor.MaintenanceInterceptor">
  33. <property name="maintenanceStartTime" value="23" />
  34. <property name="maintenanceEndTime" value="24" />
  35. <property name="maintenanceMapping" value="/SpringMVC/maintenance.htm" />
  36. </bean>
  37. <bean id="viewResolver"
  38. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  39. <property name="prefix">
  40. <value>/WEB-INF/pages/</value>
  41. </property>
  42. <property name="suffix">
  43. <value>.jsp</value>
  44. </property>
  45. </bean>
  46. </beans>

4. Enable the handler interceptor other

[html] view plaincopy
  1. <!-- 1.拦截器按照先后顺序进行拦截,2.拦截全部请求时使用"/**", 3.拦截只针对controller -->
  2. <mvc:interceptors>
  3. <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
  4. <mvc:interceptor>
  5. <mapping path="/secure/*" />
  6. <bean class="com.example.interceptor.SecurityInterceptor" />
  7. </mvc:interceptor>
  8. <mvc:interceptor>
  9. <mapping path="/admin/*.do" />
  10. <bean class="com.example.interceptor.admin.ControlInterceptor" />
  11. </mvc:interceptor>
  12. </mvc:interceptors>
[html] view plaincopy
  1. <pre name="code" class="html"></pre>
  2. <pre></pre>

参考: http://blog.csdn.net/rambo_china/article/details/7704315

spring MVC - Inteceptors(拦截器)相关推荐

  1. Spring MVC 登录拦截器

    Spring MVC 登录拦截器 1.编写拦截器 package interceptor;import org.springframework.web.servlet.HandlerIntercept ...

  2. java spring 配置词典_java之spring mvc之拦截器

    java之spring mvc之拦截器 1. springmvc 中的拦截器是由实现 HandlerInterceptor 或者继承 HandlerInterceptorAdapter 来实现的. 2 ...

  3. spring mvc +cookie+拦截器功能 实现系统自动登陆

    先看看我遇到的问题: @ResponseBody@RequestMapping("/logout")public Json logout(HttpSession session,H ...

  4. Spring MVC使用拦截器实现权限控制

    1.首先准备对应的架包 2.看看项目的架构 3.基本的web.xml文件 <!--?xml version="1.0" encoding="UTF-8"? ...

  5. Spring MVC 之拦截器(八)

    在springMVC中实现拦截器有两种方式 1.实现HandlerInterceptor接口 2.继承HandlerInterceptorAdaptor类 编写拦截器: 1 package com.c ...

  6. 【Spring学习笔记-MVC-17】Spring MVC之拦截器

    作者:ssslinppp       1. 拦截器简介及应用场景 2. 拦截器接口及拦截器适配器 3. 运行流程图 正常运行 中断流程 4. 程序实例 控制层: @Controller @Reques ...

  7. java之spring mvc之拦截器

    1. springmvc 中的拦截器是由实现 HandlerInterceptor 或者继承 HandlerInterceptorAdapter 来实现的. 2. 自定义实现一个拦截器的步骤: a). ...

  8. Spring MVC 使用拦截器 HiddenHttpMethodFilter配置Rest风格的URL

    <!-- 4.使用Rest风格的URI,将页面普通的post请求转为指定的delete或者put请求 --> 详细使用请参考这篇博客:地址:http://blog.csdn.net/ppl ...

  9. (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

    1.  过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...

最新文章

  1. 面试官:你说你精通Redis,你看过持久化的配置吗?
  2. SQL SERVER 系列(7)数据表排序和聚集函数
  3. 行为型模式:责任链模式
  4. ThreadLocal 和 InheritableThreadLocal
  5. WPF使用Animation仿WeChat(微信)播放语音消息
  6. Python生成带自定义信息和头像图片的二维码
  7. sql server权限_保护SQL Server审核的访问权限
  8. 王者服务器维修2019年四月份,王者荣耀4月25日更新内容 王者荣耀2019年4月25日全服不停机更新公告...
  9. Java 核心内容相关面试题【4】
  10. 搭建离线版keras中文文档
  11. jquery案例15——jq回到顶部
  12. linux会计软件,免费好用的会计软件(Manager for Mac)
  13. 服务器内存型号的后缀字母,收藏!CPU型号20种后缀字母是什么意思?不再被坑!...
  14. 符号---Alt+数字键
  15. 21天挑战赛第三文——多线程threading
  16. 3大基础模型,搞掂互联网产品分析
  17. 华硕部分飞行堡垒系列安装ubuntu16.04(uefi+gpt+win10环境)
  18. 为什么要使用kafka消息队列
  19. tun驱动之read
  20. 机器学习:单词拼写纠正器python实现

热门文章

  1. PXE实现Linux的自动安装
  2. Singleton + Proxy 模式+AOP
  3. Tungsten Fabric SDN — 基于 Tags 的安全访问控制策略
  4. 5GS 协议栈 — PFCP 协议 — MAR 多接入规则
  5. 架构师之路 — 数据库设计 — 关系型数据库的迁移与版本控制
  6. 性能测试场景设计之用户模式设置
  7. 分析轮子(二)- ,, (左移、右移、无符号右移)
  8. 强大的表格控件handsometable,结合vue
  9. MySQL的恢复脚本
  10. 通过XML文件生成View