springmvc 拦截器

单个拦截器的执行流程

程序首先会执行拦截器类中的preHandle()方法,如果该方法的返回值true,则程序继续向下执行处理器当中的方法,否则不在向下执行;业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向前端返回响应;在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

多个拦截器的执行流程

当多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

假设有两个拦截器Interceptor1和interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。

java 复制代码
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("request = " + request);
        System.out.println("response = " + response);
        System.out.println("handler = " + handler);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

        System.out.println("MyInterceptor.postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
        System.out.println("MyInterceptor.afterCompletion");
    }
}
java 复制代码
@Configuration
@ComponentScan("com.xxx")
@EnableWebMvc
public class SpringmvcConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置方案1:拦截全部请求
        //registry.addInterceptor(new MyInterceptor());

        //配置方案2:指定地址拦截
        //* 任意一层字符串| ** 任意多层字符串
//        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**");

        //配置方案3:排除拦截
//        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/user/**").excludePathPatterns("/user/data1");

        //先添加的拦截器优先级高,在外层。 后添加的拦截器优先级低,在内层。
        registry.addInterceptor(new MyInterceptor());
        registry.addInterceptor(new MyInterceptor1());

    }
}
相关推荐
web打印社区2 小时前
Chrome-kiosk-printing能上生产吗
开发语言·前端·javascript·chrome·websocket
白帽攻防录2 小时前
某pc客户端app从xss到rce实战案例
前端·网络安全·黑客·xss·rce·src漏洞·app漏洞
大风起兮云飞扬丶2 小时前
Java——日期类
java·开发语言
志尊宝2 小时前
AI原生前端开发(041):AI辅助的状态管理(Zustand/Pinia)
前端·javascript·ai-native
Wang's Blog2 小时前
Java 项目实战:交友项目 - 联系人管理需求分析
java·开发语言·交友
修炼的dance2 小时前
pngquant 两档质量后接 oxipng,每步省多少花几秒
前端
费曼学习法2 小时前
无人值守AI内容矩阵实战(10):Windows 无 systemd,进程存活率 99% 怎么做
前端
lazy H2 小时前
【计算机网络】第 13 篇:NAT 和端口映射是什么?为什么本地服务外网访问不了?
java·网络·网络协议·学习·计算机网络·408
小兔子2 小时前
Integer 的 == 在 100 时是 true,在 1000 时是 false
前端