spring mvc拦截器

来源:互联网 发布:stm32cubemx软件下载 编辑:程序博客网 时间:2024/05/16 10:14

1、我们最常见的拦截器(编码拦截器)

<!-- 编码过滤器 --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>



2、配置拦截器(实现拦截器)

如果有多个拦截器、则按配置的顺序执行!

2.1、实际开发用这种配置方式


<!--类似全局的拦截器:springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。--><mvc:interceptors><mvc:interceptor><!-- /**表示所有url包括子url路径 --><mvc:mapping path="/**"/><bean class="org.chenzhengyou.com.HandlerInterceptorData.HandlerInterceptor01"></bean></mvc:interceptor></mvc:interceptors>


2.2、这种也可以实现

<!--拦截器:springmvc拦截器针对HandlerMapping进行拦截设置,--><!--如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。--><!--实际开发不使用这种--><!--<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">--><!--<property name="interceptors">--><!--<list>--><!--<ref bean="handlerInterceptor1"/>--><!--</list>--><!--</property>--><!--</bean>--><!--<bean id="handlerInterceptor1" class="org.chenzhengyou.com.HandlerInterceptorData.HandlerInterceptor01"/>-->


3、实现拦截器类:HandlerInterceptor01.class  implements HandlerInterceptor


package org.chenzhengyou.com.HandlerInterceptorData;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Created by czy on 2016/11/5.<br/> * 1、测试拦截器1、实现 HandlerInterceptor 接口 * 也可以实现WebRequestInterceptor 接口<br/> * 2、把定义的拦截器类加到SpringMVC的拦截体系中 */public class HandlerInterceptor01 implements HandlerInterceptor {//进入 Handler方法之前执行//用于身份认证、身份授权//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest,                         HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("HandlerInterceptor1...preHandle");//return false表示拦截,不向下执行//return true表示放行return true;}//进入Handler方法之后,返回modelAndView之前执行//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图@Overridepublic void postHandle(HttpServletRequest httpServletRequest,                       HttpServletResponse httpServletResponse,                       Object o, ModelAndView modelAndView) throws Exception {System.out.println("HandlerInterceptor1...postHandle");}//执行Handler完成执行此方法//应用场景:统一异常处理,统一日志处理@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest,                            HttpServletResponse httpServletResponse,                            Object o, Exception e) throws Exception {System.out.println("HandlerInterceptor1...afterCompletion");}}



4、随便访问一个页面(因为我们的拦截规则是 /**)



5、结果




6、解释

6.1、postHandle (HttpServletRequest request, HttpServletResponse response,Object handle, ModelAndView modelAndView) 方法

       由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。

       postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的。 



6.2、afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handle, Exception ex) 方法

       该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。




6.3、postHandle (HttpServletRequest request, HttpServletResponse response,Object handle, ModelAndView modelAndView) 方法

        由preHandle 方法的解释我们知道这个方法包括后面要说到的afterCompletion方法都只能是在当前所属的Interceptor 的preHandle 方法的返回值为true 时才能被调用。postHandle 方法,顾名思义就是在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。

       postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的。


0 0
原创粉丝点击