一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。

Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。

spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  2. throws Exception {
  3. return true;
  4. }
  5. public void postHandle(
  6. HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
  7. throws Exception {
  8. }
  9. public void afterCompletion(
  10. HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  11. throws Exception {
  12. }

分别实现预处理、后处理(调用了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开放,那么就可以使用拦截器实现这个功能。

  1. public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
  2. private int openingTime;
  3. private int closingTime;
  4. private String mappingURL;//利用正则映射到需要拦截的路径
  5. public void setOpeningTime(int openingTime) {
  6. this.openingTime = openingTime;
  7. }
  8. public void setClosingTime(int closingTime) {
  9. this.closingTime = closingTime;
  10. }
  11. public void setMappingURL(String mappingURL) {
  12. this.mappingURL = mappingURL;
  13. }
  14. @Override
  15. public boolean preHandle(HttpServletRequest request,
  16. HttpServletResponse response, Object handler) throws Exception {
  17. String url=request.getRequestURL().toString();
  18. if(mappingURL==null || url.matches(mappingURL)){
  19. Calendar c=Calendar.getInstance();
  20. c.setTime(new Date());
  21. int now=c.get(Calendar.HOUR_OF_DAY);
  22. if(now<openingTime || now>closingTime){
  23. request.setAttribute("msg", "注册开放时间:9:00-12:00");
  24. request.getRequestDispatcher("/msg.jsp").forward(request, response);
  25. return false;
  26. }
  27. return true;
  28. }
  29. return true;
  30. }
  31. }

xml配置:

  1. <bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">
  2. <property name="openingTime" value="9" />
  3. <property name="closingTime" value="12" />
  4. <property name="mappingURL" value=".*/user\.do\?action=reg.*" />
  5. </bean>
  6. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  7. <property name="interceptors">
  8. <list>
  9. <ref bean="timeBasedAccessInterceptor"/>
  10. </list>
  11. </property>
  12. </bean>

这里我们定义了一个mappingURL属性,实现利用正则表达式对url进行匹配,从而更细粒度的进行拦截。当然如果不定义mappingURL,则默认拦截所有对Controller的请求。




UserController:

  1. @Controller
  2. @RequestMapping("/user.do")
  3. public class UserController{
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping(params="action=reg")
  7. public ModelAndView reg(Users user) throws Exception {
  8. userService.addUser(user);
  9. return new ModelAndView("profile","user",user);
  10. }
  11. // other option ...
  12. }

这个Controller相当于Struts的DispatchAction



你也可以配置多个拦截器,每个拦截器进行不同的分工. 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可以实现Bean预处理、后处理。

Spring MVC的拦截器不仅可实现Filter的所有功能,还可以更精确的控制拦截精度。

spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  2. throws Exception {
  3. return true;
  4. }
  5. public void postHandle(
  6. HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
  7. throws Exception {
  8. }
  9. public void afterCompletion(
  10. HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  11. throws Exception {
  12. }

分别实现预处理、后处理(调用了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开放,那么就可以使用拦截器实现这个功能。

  1. public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
  2. private int openingTime;
  3. private int closingTime;
  4. private String mappingURL;//利用正则映射到需要拦截的路径
  5. public void setOpeningTime(int openingTime) {
  6. this.openingTime = openingTime;
  7. }
  8. public void setClosingTime(int closingTime) {
  9. this.closingTime = closingTime;
  10. }
  11. public void setMappingURL(String mappingURL) {
  12. this.mappingURL = mappingURL;
  13. }
  14. @Override
  15. public boolean preHandle(HttpServletRequest request,
  16. HttpServletResponse response, Object handler) throws Exception {
  17. String url=request.getRequestURL().toString();
  18. if(mappingURL==null || url.matches(mappingURL)){
  19. Calendar c=Calendar.getInstance();
  20. c.setTime(new Date());
  21. int now=c.get(Calendar.HOUR_OF_DAY);
  22. if(now<openingTime || now>closingTime){
  23. request.setAttribute("msg", "注册开放时间:9:00-12:00");
  24. request.getRequestDispatcher("/msg.jsp").forward(request, response);
  25. return false;
  26. }
  27. return true;
  28. }
  29. return true;
  30. }
  31. }

xml配置:

  1. <bean id="timeBasedAccessInterceptor" class="com.spring.handler.TimeBasedAccessInterceptor">
  2. <property name="openingTime" value="9" />
  3. <property name="closingTime" value="12" />
  4. <property name="mappingURL" value=".*/user\.do\?action=reg.*" />
  5. </bean>
  6. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  7. <property name="interceptors">
  8. <list>
  9. <ref bean="timeBasedAccessInterceptor"/>
  10. </list>
  11. </property>
  12. </bean>

这里我们定义了一个mappingURL属性,实现利用正则表达式对url进行匹配,从而更细粒度的进行拦截。当然如果不定义mappingURL,则默认拦截所有对Controller的请求。




UserController:

  1. @Controller
  2. @RequestMapping("/user.do")
  3. public class UserController{
  4. @Autowired
  5. private UserService userService;
  6. @RequestMapping(params="action=reg")
  7. public ModelAndView reg(Users user) throws Exception {
  8. userService.addUser(user);
  9. return new ModelAndView("profile","user",user);
  10. }
  11. // other option ...
  12. }

这个Controller相当于Struts的DispatchAction



你也可以配置多个拦截器,每个拦截器进行不同的分工.  转

Spring MVC 中 HandlerInterceptorAdapter的使用的更多相关文章

  1. Spring MVC 中 HandlerInterceptorAdapter的使用--转载

    原文地址:http://blog.csdn.net/liuwenbo0920/article/details/7283757 一般情况下,对来自浏览器的请求的拦截,是利用Filter实现的,这种方式可 ...

  2. spring mvc中实现csrf安全防御简记

    1.csrf是什么 csrf全称是Cross-site request forgery,http://en.wikipedia.org/wiki/Csrf 危害:使受害用户在不经意间执行了不是用户意愿 ...

  3. Spring mvc中@RequestMapping 6个基本用法

    Spring mvc中@RequestMapping 6个基本用法 spring mvc中的@RequestMapping的用法.  1)最基本的,方法级别上应用,例如: Java代码 @Reques ...

  4. spring mvc中使用freemark的一点心得

    参考文档: FreeMarker标签与使用 连接http://blog.csdn.net/nengyu/article/details/6829244 freemarker学习笔记--指令参考: ht ...

  5. Http请求中Content-Type讲解以及在Spring MVC中的应用

    引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...

  6. Spring mvc中@RequestMapping 6个基本用法小结(转载)

    小结下spring mvc中的@RequestMapping的用法. 1)最基本的,方法级别上应用,例如: @RequestMapping(value="/departments" ...

  7. Spring MVC中处理静态资源的多种方法

    处理静态资源,我想这可能是框架搭建完成之后Web开发的”头等大事“了. 因为一个网站的显示肯定会依赖各种资源:脚本.图片等,那么问题来了,如何在页面中请求这些静态资源呢? 还记得Spring MVC中 ...

  8. Spring MVC 中的基于注解的 Controller【转】

    原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 H ...

  9. spring mvc中的文件上传

    使用commons-fileupload上传文件所需要的架包有:commons-fileupload 和common-io两个架包支持,可以到Apache官网下砸. 在配置文件spring-mvc.x ...

随机推荐

  1. 在 Linux 中查看时区

    1.date date +"%Z %z" 或者 date -R 2.timedatectl timedatectl|grep "Timezone" 可以使用 t ...

  2. Bzoj2957 楼房重建

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1516  Solved: 723[Submit][Status][Discuss] Descripti ...

  3. POJ2175 Evacuation Plan

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4617   Accepted: 1218   ...

  4. iOS 打包 测试 发布

    1.企业版 1.1 打包 1.1.1 使用apple企业账号 获取 证书cer,描述文件provision (开发 生产) *注: 描述文件 又 三者组成(cer + appId + bundleId ...

  5. mybatis源码分析:

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #e4af0a } p. ...

  6. 微信开发包注意jar版本:

    微信java jar的加密key的大小支持 异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件( ...

  7. 初识JVM--java虚拟机的基本知识

    JVM运行时的内存块 pc寄存器:(线程独有)保存线程运行的java方法地址 Java 虚拟接栈(线程独有):用于存储线程的栈帧 Java堆(全局共享):随着Java虚拟机的启动 创建 存储着所有对象 ...

  8. BootLoader(2440)核心初始化代码

    1.gboot.lds OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS {    . = 0x30008000; //起始地址        . = ALIGN(4);// ...

  9. SVN服务器搭建

    一.SVN下载:https://tortoisesvn.net/downloads.html,下载安装步骤百度一下,基本上都是一路点击next即可安装完成. 服务端安装文件: 二.测试是否安装成功,在 ...

  10. 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生

    类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...