💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 概述 SpringMVC的处理器拦截器类似于servlet开发中的顾虑器filter,用于对处理器进行预处理和后处理.用户可以自定义一些拦截器来实现特定的功能.谈到拦截器,还要向大家提一个词-拦截器链(Interceptor Chain).拦截器链就是将拦截器按一定的顺序联结成一条链.在访问被拦截的方法或字段时,拦截链中的拦截器就会按其之前定义的顺序被调用. ## 区别 过滤器:是servlet规范中的一部分,任何java web工程师都可以使用. 拦截器:是springMVC框架自己的,只有使用springMVC框架才能用. 过滤器:在url-pattern中配置了/*之后,可以对所有要访问的资源拦截. 过滤器它只会拦截访问的控制器方法,如果是JSP,HTML,css,image或者JS是不会进行拦截的. 它是AOP思想的具体应用.我们要想自定义拦截器,要求必须实现HandlerInterceptor接口. ## 步骤 1. 编写拦截器类,实现HandlerInterceptor接口. 2. 配置拦截器. ## 配置 ~~~ <!--配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/*"/> <!--不要拦截的方法.配置一个就行了--> <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>--> <!--指定拦截器--> <bean class="com.like.interceptor.MyInterceptor1"/> </mvc:interceptor> </mvc:interceptors> ~~~ ## 预处理 ~~~ package com.like.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor1 implements HandlerInterceptor { //预处理.return true是放行.如果return false就是不放行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //请求转发,这样是不会走到控制器中的 request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response); return false; //return false不会往下面走了 } } ~~~ ## 后处理1 ~~~ //controller方法执行后,success.jsp页面执行前 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("后处理"); //虽然进行请求转发了也跳转到error.jsp页面了.但是success.jsp页面的内容也是会执行的.但是不显示 request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request, response); } ~~~ ## 后处理2 ~~~ //success.jsp页面执行后,该方法会性质 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("hello"); } ~~~ ## 拦截器链 ~~~ <!--配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/*"/> <!--不要拦截的方法.配置一个就行了--> <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>--> <!--指定拦截器--> <bean class="com.like.interceptor.MyInterceptor1"/> </mvc:interceptor> <mvc:interceptor> <!--要拦截的具体方法--> <mvc:mapping path="/*"/> <!--不要拦截的方法.配置一个就行了--> <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>--> <!--指定拦截器--> <bean class="com.like.interceptor.MyInterceptor2"/> </mvc:interceptor> </mvc:interceptors> ~~~ ~~~ package com.like.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor1 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor1"); return true; } } ~~~ ~~~ package com.like.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor2 implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor2"); return false; } } ~~~ 结果: ``` MyInterceptor1 MyInterceptor2 ```