• 使用拦截器来检测用户的登录状态


    关于拦截器的概念及定义不再过多的进行阐述, 我们只需要知道为什么要使用拦截器? 其便利性如何? 其次就是具体的使用步骤.

    1 为什么要使用拦截器?

      这里我们可以举个例子做个对比, 如果我们做了一个日记记录的系统, 其中主要的功能当然就是写日记, 修改日记以及查看日记, 但是这个系统要求必须是用户登录之后才可以进行查看日记的详情以及写日记和修改日记, 这时候我们就想到了用户登录后将用户信息存储在 session 中, 然后写日记 / 修改日记 / 查看日记详情的时候进行校验, 判断是不是登录状态, 如果未登录, 直接拒绝使用这三个功能, 如下面所示:
    在这里插入图片描述
    这样的解决方式是可以的, 毕竟目前的这个系统的功能就只有三个, 但是如果是一个庞大的系统, 我们每次都要去使用这个方法显然是比较繁琐的, 因此就诞生了拦截器这个概念, 因为拦截器是在 Servlet 执行之前执行的程序, 或者是 controller 代码执行之前执行的程序, 因此用拦截器来检测用户的登录状态再好不过了!!!
    在这里插入图片描述

    2 具体的使用步骤

    第一步: 创建一个检测用户是否登录的拦截器, 实现 HandlerInterceptor 接口并重写 preHandle;
    拦截器我放在了我项目工具类包里面:
    在这里插入图片描述
    代码如下:

    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 {
            // 1. 获取 session
            HttpSession session = request.getSession(false);
            // 2. 读取 session 中的用户
            Object user = session.getAttribute(AppFinal.USERINFO_SESSION_KEY);
            // 3. 判断用户是否存在
            if (user == null) {
               // 4. 不存在, 拦截, 返回错误状态码 409(自定)
               response.setStatus(409);
               return false;
            }
            // 5. 存在
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    这段代码比较简单, 不做解释!
    第二步: 配置拦截器和拦截规则
    这里的类我都放在了配置文件包里面:
    在这里插入图片描述
    通过代码来进行解读:

    /**
     * 全局配置文件
     */
    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
        // 配置拦截器和拦截规则
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginInterceptor())
                    .addPathPatterns("/**") // 拦截所有请求
                    .excludePathPatterns("/css/**")
                    .excludePathPatterns("/js/**")
                    .excludePathPatterns("/img/**")
                    .excludePathPatterns("/login.html");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • .addPathPatterns("/"): 代表拦截所有的请求;**
    • .excludePathPatterns("/css/"): 代表排除对 css 文件夹下的所有文件的拦截;**
    • 关于主要拦截什么, 可以这样理解, 因为要检测的是用户的登录状态, 因此登录界面肯定是不会拦截的, 因此 .excludePathPatterns(“/login.html”) 这里就排除了对登录界面的拦截, 拦截什么不拦截什么就自己的系统而定.

    3 注意事项

    • 一个项目中可以同时配置多个拦截器;
    • 在配置拦截器及拦截规则的时候, 要给当前的类添加 @Configuration 注解.
  • 相关阅读:
    java的stream让我灵光一现
    软考141-上午题-【软件工程】-杂题+小结
    Vue笔记-vue中使用JS创建的函数
    从零开始配置vim(20)——模糊查询
    LeetCode 118. 杨辉三角(及119)
    sCrypt 现在支持 Ordinals 了
    学完自动化测试一年,达到月薪15K、我的这份笔记希望能让你受益良多...
    【Vue五分钟】Vue项目的后期打包、上传、构建文档、组件测试操作
    ArrayList和LinkedList的区别
    多级缓存的原理和实现
  • 原文地址:https://blog.csdn.net/Onion_521257/article/details/127712572