拦截器总体流程:
拦截器:对请求到达控制层前后做更多的管理 有点aop的味道。类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
拦截器和过滤器的区别?
过滤器是 servlet 规范中的一部分,任何 java web 工程都可以使用。
拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。
我们要想自定义拦截器, 要求必须实现:HandlerInterceptor
实现HandlerInterceptor配置拦截器
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor1 preHandle------1111");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle------1111");
}
/**
* 当页面执行完毕后执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion------1111");
}
}
方法说明。
public interface HandlerInterceptor {
/**
* 如何调用:
* 按拦截器定义顺序调用
* 何时调用:
* 只要配置了都会调用
* 有什么用:
* 如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去
* 进行处理,则返回 true。
* 如果程序员决定不需要再调用其他的组件去处理请求,则返回 false。
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
return true;
}
/**
* 如何调用:
* 按拦截器定义逆序调用
* 何 时调用:
* 在拦截器链内所有拦截器返成功调用
* 有什么用:
* 在业务处理器处理完请求后,但是 DispatcherServlet 向客户端返回响应前被调用,
* 在该方法中对用户请求 request 进行处理。
*/
default void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
/**
* 如何调用:
* 按拦截器定义逆序调用
* 何时调用:
* 只有 preHandle 返回 true 才调用
* 有什么用:
* 在 DispatcherServlet 完全处理完请求后被调用,
* 可以在该方法中进行一些资源清理的操作。
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {
}
在xml文件内注册拦截器。
<mvc:interceptors>
<!--拦截器执行的顺序和配置的顺序有关
哪一个先配置哪一个先执行
-->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.fpy.intercept.MyInterceptor2"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/test/*"/>
<bean class="com.fpy.intercept.MyInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
控制器代码
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/login")
public String login() throws SysException {
System.out.println("Controller<===>Login");
return "success";
}
}
运行效果图: