目录
一:SpringMVC提供了拦截器机制;允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理;
1:HandlerInterceptor---SpringMVC的拦截器接口
一:SpringMVC提供了拦截器机制;允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理;
1:HandlerInterceptor---SpringMVC的拦截器接口
preHandle:在目标方法运行之前调用;返回boolean;return true;(chain.doFilter())放行; return false;不放行
postHandle:在目标方法运行之后调用:目标方法调用之后
afterCompletion:在请求整个完成之后;来到目标页面之后;chain.doFilter()放行;资源响应之后;
2:简单的拦截器-HandelerInterceptor
2.1:实现HandlerInterceptor接口;
package com.wkl.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* Description:简单的自定义拦截器
* Date: 2020/8/17 - 下午 2:33
* author: wangkanglu
* version: V1.0
*/
public class MyFirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle.........");
return true;
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle.........");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion.........");
}
}
2.2:配置拦截器
<!--配置自定义的拦截器--> <mvc:interceptors> <!--直接写自定义拦截器的bean,默认拦截所有的请求--> <!-- <bean></bean>--> <!--为某个路径配置拦截器--> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean id="firstInterceptor" class="com.wkl.interceptor.MyFirstInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
2.3:拦截器的运行流程
2.4:拦截器运行流程
1:正常运行流程;
拦截器的preHandle------目标方法-----拦截器postHandle-----页面-------拦截器的afterCompletion;
2:只要preHandle不放行就没有以后的流程;
3:目标方法异常,只要preHandle放行了,afterCompletion都会执行;
3:多拦截器执行顺序
3.1:正常流程
注:像同心圆一样;先进后出,后进先出
至于执行的顺序,则按照配置的顺序,先配置就先执行;
3.2:异常流程
1:那一块的prehandle不放行;后边的就都没有
2:第一个拦截器的perhandle放行,第二个不放行;那么第一个已经放行了的拦截器的afterCompletion总会执行;
3:拦截器的preHandle:是按照顺序执行
拦截器的postHandle:是按照逆序执行
拦截器的afterCompletion:是按照逆序执行;
已经放行了的拦截器的afterCompletion总会执行;
4:拦截器的原理以及源码
5:拦截器执行时序图
二:拦截器和过滤器区别
拦截器是由ioc容器管理的;需要其他组件配合完成,我们就使用拦截器;
filter是由javaweb管理的;其他情况;如改变请求编码等情况可以使用filter过滤器;