您的位置:首页 > 编程语言 > Java开发

[j2ee][springMVC]springMVC中的拦截器及其应用

2013-01-22 09:19 295 查看
一,首先介绍springMVC中的拦截器

Spring MVC 拦截器

Controller层的拦截器继承于HandlerInterceptorAdapter

HandlerInterceptorAdapter.java

 1 public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {
 2 
 3     /**
 4      * This implementation always returns <code>true</code>.
 5      */
 6     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
 7         throws Exception {
 8         return true;
 9     }
10 
11     /**
12      * This implementation is empty.
13      */
14     public void postHandle(
15             HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
16             throws Exception {
17     }
18 
19     /**
20      * This implementation is empty.
21      */
22     public void afterCompletion(
23             HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
24             throws Exception {
25     }
26 
27 }
Spring拦截器通过重写这三个方法实现Controller的拦截。

配置拦截器
xml

 1 <bean id="handlerMapping"
 2           class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 3         <property name="interceptors">
 4             <list>
 5                 <ref bean="controllerInterceptor" />
 6             </list>
 7         </property>
 8         <property name="mappings">
 9             <props>
10                 <prop key="/hao/hello.do">helloWorldController</prop>
11             </props>
12         </property>
13     </bean>
14     
15     <bean id="controllerInterceptor" class="com.web.spring.mvc.interceptor.ControllerInterceptor"/>
16 
ControllerInterceptor.java

 1 public class ControllerInterceptor extends HandlerInterceptorAdapter {
 2 
 3     /**
 4      * 在Controller方法前进行拦截
 5      */
 6     public boolean preHandle(HttpServletRequest request,
 7             HttpServletResponse response, Object handler) throws Exception {
 8         System.out.println("ControllerInterceptor.preHandle()");
 9         return true;
10     }
11 
12     /**
13      * This implementation is empty.
14      */
15     public void postHandle(HttpServletRequest request,
16             HttpServletResponse response, Object handler,
17             ModelAndView modelAndView) throws Exception {
18         System.out.println("ControllerInterceptor.postHandle()");
19     }
20 
21     /**
22      * 在Controller方法后进行拦截
23      */
24     public void afterCompletion(HttpServletRequest request,
25             HttpServletResponse response, Object handler, Exception ex)
26             throws Exception {
27         System.out.println("ControllerInterceptor.afterCompletion()");
28     }
29 }

说明:
发起请求,进入拦截器链,运行所有拦截器的preHandle方法,
1.当preHandle方法返回false时,从当前拦截器往回执行所有拦截器的afterCompletion方法,再退出拦截器链。
2.当preHandle方法全为true时,执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链,运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法.
当有拦截器抛出异常时,会从当前拦截器往回执行所有拦截器的afterCompletion方法

Controller

 1 
 2 @Controller
 3 @RequestMapping("/hao")
 5 public class HelloWorldController {
 6 
 7     @RequestMapping(value = "/hello")
 8     public String hello(HttpServletRequest request, HttpServletResponse response) {
 9         System.out.println("hello");
15         return "helloWorld";
16     }
17 }



[b]二,springMVC中拦截器的执行顺序
[/b]
我在mvc-servlet.xml中放入了两个拦截器

<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.wendellup.web.base.annotation.method.security.SystemCommonInterceptor">
<property name="moreThanTime">
<value>500</value>
</property>
</bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean
class="com.wendellup.web.base.annotation.method.business.AnnotationBusinessDescInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>

并在这两个拦截器中preHandle,postHandle,afterCompletion中和controller中添加测试语句
启动服务器访问tomcat后控制台的代码如下:
[INFO ] 2013-01-22 15:55:23 :SystemCommonInterceptor: preHandle
[INFO ] 2013-01-22 15:55:23 :AnnotationBusinessDescInterceptor: preHandle
[INFO ] 2013-01-22 15:55:23 :------------LoginController------------
[INFO ] 2013-01-22 15:55:23 :AnnotationBusinessDescInterceptor: postHandle
[INFO ] 2013-01-22 15:55:23 :SystemCommonInterceptor: postHandle
[INFO ] 2013-01-22 15:55:23 :AnnotationBusinessDescInterceptor: afterCompletion
[INFO ] 2013-01-22 15:55:23 :SystemCommonInterceptor: afterCompletion


三,springMVC中拦截器的应用

1.一次请求所花费的时间

2.某个controller需要登录才能访问

3.springMVC实现动态国际化

4.某个方法必须加自定义的注释

具体项目地址如下: http://pan.baidu.com/share/link?shareid=273982&uk=3475027816
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  j2EE springMVC