spring mvc中拦截器的用法。
一、实现流程
(1)首先创建一个包,写入一个拦截器的类
(2)在spring-mvc.xml中注册这个拦截器
要点如下:
1 2 3 4 5 6 |
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.xie.interceptors.testinterceptor"></bean> </mvc:interceptor> </mvc:interceptors> |
- 最外层是<mvc:interceptors>。
- 包裹着一个<mvc:interceptor>。
- 配置拦截器的作用路径,如果为/**或者不配置都是默认拦截所有路径<mvc:mapping path=”/**”/>。
- 拦截器类的位置<bean class=”com.xie.interceptors.testinterceptor”></bean>。
(3)如何写出一个拦截器类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com.xie.interceptors; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class testinterceptor implements HandlerInterceptor { // 该方法在目标方法之前被调用 // 返回值为true,则继续调用后续的拦截器和目标方法 // 返回值为false,不会再调用后续的拦截器和目标方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle start"); System.out.println(request.getParameter("test")); // response.sendRedirect("http://www.xie4ever.cn"); response.reset(); ServletOutputStream outputStream = response.getOutputStream(); outputStream.print("godlikexie"); outputStream.flush(); outputStream.close(); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle start"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion start"); } } |
首先需要继承HandlerInterceptor,继承这个方法之后就会要求你加入三个方法,可以实现各种时机的拦截器功能。
要注意方法的执行顺序,执行的时机,才能搞清楚你要的功能需要写在哪个方法里。
我个人认为用得最多的的是preHandle,作用时机在执行controller之前,这个方法有一个返回值,执行完你想要的拦截器方法后,需要进行return。
- 如果return true,将会往下走执行controller,并且执行拦截器的其他方法。
- 如果return false,那么接下来就不会执行controller了,会直接去执行afterCompletion(),并且退出。
1.preHandle
在业务处理器处理请求之前被调用。
- 如果返回false,从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链。
- 如果返回true,执行下一个拦截器,直到所有的拦截器都执行完毕。再执行被拦截的Controller,然后进入拦截器链,从最后一个拦截器往回执行所有的postHandle(),接着再从最后一个拦截器往回执行所有的afterCompletion()。
经常用于做权限管理,登录验证,安全校验。
2.postHandle
在业务处理器处理请求执行完成后,生成视图之前执行的动作,所以说这个方法的作用时间是在controller执行完之后,在视图渲染之前。
所以这个东西方法经常做一些渲染视图的工作。比方说,可以在modelAndView中加入数据,在视图中读取。
3.afterCompletion
最后执行的东西,在DispatcherServlet完全处理完请求后被调用,做收尾工作。
因为是最后执行的,所以可以做一些资源回收工作。比如说销毁session,清除cookie。
二、总结
这是spring mvc中拦截器的基本用法,下次将会根据实例来用拦截器实现一个功能。