1、拦截器概述
在SpringMVC框架中,处理器拦截器扮演着与Servlet过滤器(Filter)相似的角色,它们负责对处理器(Handler)进行预处理和后处理。开发者可以自定义拦截器以实现特定的业务需求。
过滤器与拦截器的主要区别:
- 过滤器
- 是servlet规范的一部分,适用于任何JavaWeb项目。
- 通过在url-pattern中配置/*,可以对所有访问的资源进行过滤。
- 拦截器
- 是SpringMVC特有的,仅在SpringMVC项目中可用。
- 仅拦截进入SpringMVC框架的请求,即进入DispatcherServlet的请求。
- 对于.jsp等资源请求,拦截器不会生效,因为这些请求并未进入DispatcherServlet,而是直接由Tomcat的JspServlet处理。
拦截器是面向切面编程(AOP)思想的实践体现。
2、拦截器使用
自定义拦截器
如何实现自定义拦截器呢?首先,需要实现HandlerInterceptor
接口。
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
preHandle
:在处理器执行之前执行。- 返回
true
:继续执行下一个拦截器或处理器。 - 返回
false
:中断请求处理链,需要自行处理请求和响应。
- 返回
postHandle
:在处理器执行之后,视图解析器解析视图之前执行。- 可以修改
ModelAndView
来控制模型数据和即将跳转的视图(仅限于返回逻辑视图名的处理器)。
- 可以修改
afterCompletion
:在请求处理完成后执行(即视图渲染后)。- 无论处理器是否正常执行(可能抛出异常),此方法都会执行。
- 类似于
try-catch
中的finally
,常用于资源清理和异常处理。
自定义拦截器MyInterceptor
:
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
System.out.println("------------preHandle------------");
return !"false".equals(httpServletRequest.getParameter("status"));
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("------------postHandle------------");
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("------------afterCompletion------------");
System.out.println(e);
if (e != null)
httpServletRequest.getRequestDispatcher("/").forward(httpServletRequest, httpServletResponse);
}
}
配置拦截器
在Spring的配置文件中定义拦截器:
mvc:mapping
:定义拦截器映射的路径。mvc:exclude-mapping
:在映射拦截路径中排除的路径。bean
:配置的拦截器类。
测试
添加Controller
:
@RestController
public class TestController {
@RequestMapping("test1")
public String test1() {
System.out.println("Handler执行");
return "hello";
}
}
-
拦截器拦截:后续处理链不会执行。
-
拦截器放行:请求正常处理。
-
处理器出现异常:
postHandle
不会执行,异常被afterCompletion
捕获,并由afterCompletion
处理请求。
3、拦截器执行顺序
添加MyInterceptor2
:
```java
public class MyInterceptor2 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {
System.out.println("------------preHandle-2------------");
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4281.html