当前位置: 首页 > news >正文

【Spring Boot2】拦截器

目录

  • 实现拦截器步骤
    • 一、HandlerInterceptor
    • 二、容器
    • 三、拦截范围
  • 原理

实现拦截器步骤

一、HandlerInterceptor

编写一个拦截器实现HandlerInterceptor接口

/**
 * 登录检查
 * 1.配置好拦截器要拦哪些请求
 * 2.把这些配置放在容器中
 */
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行之前
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestUrl = request.getRequestURI();
        log.info("preHandle拦截的请求路径是{}", requestUrl);
        // 登录检查逻辑
        HttpSession session = request.getSession();
        Object loginUser = session.getAttribute("loginUser");
        if (loginUser != null) {
            // 放行
            return true;
        }

        // 拦截住 未登录 跳转到登录页面
        session.setAttribute("msg", "请先登录");
//        response.sendRedirect("/");
        request.getRequestDispatcher("/").forward(request, response);
        return false;
    }

    /**
     * 目标方法执行完成之后
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

        log.info("postHandle执行{}", modelAndView);

    }

    /**
     * 页面渲染以后
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        log.info("afterCompletion执行异常{}", ex);

    }
}

二、容器

拦截器注册到容器中,实现WebMvcConfigurer的addInterceptors

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor())
                // 所有请求都被拦截包括静态资源
                .addPathPatterns("/**")
                // 不被拦截的资源
                .excludePathPatterns("/", "/login","/css/**","/images/**","/js/**");
    }
}

三、拦截范围

指定拦截规则,如果是拦截所有,静态资源也会被拦截(如前后端不分离的时候,前端东西会被拦截,目前来说大多数我们都是前后端分离开发,道理明白就好)

原理

  1. 根据当前请求,找到HandlerExecutionChain。
  2. 先来顺序执行所有拦截器的preHandle方法。
  • 如果当前拦截器preHandler返回为true,则执行下一个拦截器的preHandler。

  • 如果当前拦截器返回为false,直接倒序执行所有已经执行了的拦截器的afterCompletion。

  • 如果任何一个拦截器返回false,直接跳出不执行目标方法。

  • 所有拦截器都返回true,执行目标方法。

  • 倒序执行所有拦截器的postHandle方法。

  • 前面的步骤有任何异常都会直接倒序触发afterCompletion。

  • 页面成功渲染完成以后,也会倒序触发afterCompletion。

在这里插入图片描述

相关文章:

  • 【Java】Jackson - ObjectMapper
  • 【Java】根据名称首字母进行排序
  • 【Java】LocalDateTime类
  • 【Java】java8 list去重其中某个相同属性
  • 【java】判断对象中的每个属性值是否全部为null
  • 【PostgreSql】各种数据类型查询
  • 【ElasticSearch】实操 - http
  • 【ElasticSearch】入门了解
  • 【Mysql】2003 - Can‘t connect to MySQL server on ‘127.0.0.1‘ (61 “Connection refused“)
  • 【Reactor】总结
  • 【PostgreSql】sql优化
  • 【flyway】SpringBoot集成Flyway
  • 【java】List<string>转string
  • 【java】list根据日期倒排,日期相同按名称首字母排序
  • 【Python】python安装
  • 【EOS】Cleos基础
  • 【技术性】Search知识
  • co模块的前端实现
  • ESLint简单操作
  • Java 最常见的 200+ 面试题:面试必备
  • js 实现textarea输入字数提示
  • k个最大的数及变种小结
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • spring-boot List转Page
  • tweak 支持第三方库
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • web标准化(下)
  • 初识MongoDB分片
  • 浮动相关
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 跨域
  • 排序算法学习笔记
  • 前端路由实现-history
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我的zsh配置, 2019最新方案
  • FaaS 的简单实践
  • # Java NIO(一)FileChannel
  • ###项目技术发展史
  • #NOIP 2014# day.2 T2 寻找道路
  • #图像处理
  • (2020)Java后端开发----(面试题和笔试题)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Python第六天)文件处理
  • (分布式缓存)Redis分片集群
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (全注解开发)学习Spring-MVC的第三天
  • (十三)Flask之特殊装饰器详解
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)我也是一只IT小小鸟
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Core 和 .NET Framework 中的 MEF2
  • @ConditionalOnProperty注解使用说明
  • @拔赤:Web前端开发十日谈