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
 
                

