SpringMVC中的拦截器主要用于拦截控制器方法的执行。
SpringMVC配置拦截器
SpringMVC中的拦截器需要实现HandlerInterceptor接口- public class FirstInterceptor implements HandlerInterceptor {
- //该方法是在控制器方法执行前执行
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>@Override
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- <mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors>System.out.println("FirstInterceptor->preHandle");
- <bean id="firstInterceptor"/>
- <mvc:interceptors>
- <ref bean="firstInterceptor"/>
- </mvc:interceptors>//返回false执行拦截,true放行
- <mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors>return HandlerInterceptor.super.preHandle(request,response,handler);
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>}
- //该方法是在控制器方法执行后执行
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>@Override
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- <mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors>System.out.println("FirstInterceptor->postHandle");
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>}
- //该方法是在视图渲染后执行
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>@Override
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- <mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors>System.out.println("FirstInterceptor->after");
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>}
- }
复制代码拦截器中三个默认方法说明:
preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法。
postHandle:控制器方法执行之后执行postHandle()。
afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
SpringMVC的拦截器三种配置方式
方式1:使用bean标签
- <mvc:interceptors>
- <bean />
- </mvc:interceptors>
复制代码 方式2:引入外部bean
- <bean id="firstInterceptor"/>
- <mvc:interceptors>
- <ref bean="firstInterceptor"/>
- </mvc:interceptors>
复制代码 方式3:使用注解方式
将拦截器的实现类注入到spring容器中- @Component //将实现类注入到容器中
- public class FirstInterceptor implements HandlerInterceptor {}
复制代码 开启组件扫描- [/code]配置拦截器
- [code]<bean id="firstInterceptor"/>
- <mvc:interceptors>
- <ref bean="firstInterceptor"/>
- </mvc:interceptors><bean id="firstInterceptor"/>
- <mvc:interceptors>
- <ref bean="firstInterceptor"/>
- </mvc:interceptors>
复制代码结论:
以上三种方式:都是对所有请求进行拦截
bean标签和ref标签配置的拦截器默认对DispatcherServlet处理的所有的请求进行拦截或放行。
排除指定的拦截请求
- <mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors><mvc:interceptors>
- <bean />
- </mvc:interceptors>
复制代码 多个拦截器的执行顺序
通过观察源码:
1、若每个拦截器的preHandle()都返回true,则多个拦截器的执行顺序是按照在SpringMVC配置文件的配置顺序执行。
说明:
preHandle()会按照配置的顺序执行(由上而下),而postHandle()和afterComplation()会按照配置的反序执行(由下而上)。
2、若多个拦截器中的某个拦截器的preHandle()返回false。preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |