springMVC3学习(七)--Interceptor拦截器

本文详细介绍了Spring MVC中的拦截器实现方法,包括HandlerInterceptor接口及其方法preHandle、postHandle和afterCompletion的作用与使用场景,并提供了配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring为我们提供了:org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,

实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

有以下三个方法:

Action之前执行

[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. publicbooleanpreHandle(HttpServletRequestrequest,
  2. HttpServletResponseresponse,Objecthandler)

生成视图之前执行

[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. publicvoidpostHandle(HttpServletRequestrequest,
  2. HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)

最后执行,可用于释放资源

[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. publicvoidafterCompletion(HttpServletRequestrequest,
  2. HttpServletResponseresponse,Objecthandler,Exceptione)

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

在preHandle中,可以进行编码、安全控制等处理;

在postHandle中,有机会修改ModelAndView;

在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

参数中的Object handler是下一个拦截器。


如何使用拦截器

自定义一个拦截器,要实现HandlerInterceptor接口:

[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. publicclassMyInterceptorimplementsHandlerInterceptor{...}

在springMVC的配置文件中配置有三种方法

一、拦截所有URL

[html] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <mvc:interceptors>
  2. <beanclass="com.itmyhome.MyInterceptor"/>
  3. </mvc:interceptors>

二、拦截匹配的URL

[html] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <mvc:interceptors>
  2. <mvc:interceptor>
  3. <mvc:mappingpath="/login"/>
  4. <beanclass="com.itmyhome.MyInterceptor"></bean>
  5. </mvc:interceptor>
  6. </mvc:interceptors>

三、HandlerMappint上的拦截器

[html] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  2. <propertyname="interceptors">
  3. <list>
  4. <beanclass="com.itmyhome.MyInterceptor"></bean>
  5. </list>
  6. </property>
  7. </bean>

如果使用了<mvc:annotation-driven />, 它会自动注册DefaultAnnotationHandlerMapping 与

AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,

就可以给interceptors属性注入拦截器了。


拦截器MyInterceptor类

[java] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. importjavax.servlet.http.HttpServletRequest;
  2. importjavax.servlet.http.HttpServletResponse;
  3. importorg.springframework.web.servlet.HandlerInterceptor;
  4. importorg.springframework.web.servlet.ModelAndView;
  5. publicclassMyInterceptorimplementsHandlerInterceptor{
  6. publicvoidafterCompletion(HttpServletRequestrequest,
  7. HttpServletResponseresponse,Objecthandler,Exceptione)
  8. throwsException{
  9. System.out.println("******afterCompletion******");
  10. }
  11. publicvoidpostHandle(HttpServletRequestrequest,
  12. HttpServletResponseresponse,Objecthandler,ModelAndViewarg3)
  13. throwsException{
  14. System.out.println("******postHandle******");
  15. }
  16. /**
  17. *如果返回false从当前拦截器往回执行所有拦截器的afterCompletion方法,再退回拦截器链如果返回true
  18. *执行下一个拦截器,直到所有拦截器都执行完毕再运行被拦截的Controller
  19. *然后进入拦截器链从最后一个拦截器往回运行所有拦截器的postHandle方法
  20. *接着依旧是从最后一个拦截器往回执行所有拦截器的afterCompletion方法
  21. */
  22. publicbooleanpreHandle(HttpServletRequestrequest,
  23. HttpServletResponseresponse,Objecthandler)throwsException{
  24. System.out.println("******preHandle******");
  25. returntrue;
  26. }
  27. }

spring配置文件

[html] view plain copy
在CODE上查看代码片 派生到我的代码片
  1. <!--拦截所以URL
  2. <mvc:interceptors>
  3. <beanclass="com.itmyhome.MyInterceptor"/>
  4. </mvc:interceptors>
  5. -->
  6. <!--拦截匹配URL-->
  7. <mvc:interceptors>
  8. <mvc:interceptor>
  9. <mvc:mappingpath="/login"/>
  10. <beanclass="com.itmyhome.MyInterceptor"></bean>
  11. </mvc:interceptor>
  12. </mvc:interceptors>
  13. <!--HandlerMappint上的拦截器
  14. <beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  15. <propertyname="interceptors">
  16. <list>
  17. <beanclass="com.itmyhome.MyInterceptor"></bean>
  18. </list>
  19. </property>
  20. </bean>-->
  21. <!--默认扫描的包路径-->
  22. <context:component-scanbase-package="com.itmyhome"/>
  23. <!--添加注解驱动-->
  24. <mvc:annotation-driven/>
  25. <!--如果使用HandlerMappint拦截器则注释以上注册驱动的方法,使用以下人工配置bean-->
  26. <!--<beanclass="com.itmyhome.Login"></bean>-->
  27. <!--处理器-->
  28. <beanname="/login"class="com.itmyhome.Login"></bean>
  29. <!--HandlerMapping
  30. <beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>-->
  31. <!--HandlerAdapter
  32. <beanclass="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>-->
  33. <!--定义跳转的文件的前后缀-->
  34. <beanid="viewResolver"
  35. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  36. <propertyname="prefix"value="/"/><!--默认放在WebRoot下-->
  37. <propertyname="suffix"value=".jsp"/>
  38. </bean>

测试URL:http://localhost:8080/spring_Interceptor/login

查看后台会执行拦截器代码

项目源码下载:http://download.youkuaiyun.com/detail/itmyhome/7372023

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值