点评项目-3-登录成功后加载登录页面

embedded/2024/9/30 4:20:34/

业务:在登录成功后,前端会发送/api/user/me 的 get 请求,我们需要将 session 中的 user 返回给页面,由于后续会有多个业务需要用到登录状态的校验,故这里使用拦截器完成登录状态校验功能

第一步,写一个拦截器类

java">public class LoginInterceptor implements HandlerInterceptor {//前置拦截@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//拿到 session 中的 userObject user = request.getSession().getAttribute("user");//若用户不存在,拦截if(user == null){response.setStatus(401);//响应 401 状态码,表示未授权return false;}//将用户保存在 ThreadLocal 中,调用 UserHolder 中的静态方法UserHolder.saveUser((User) user);//放行return HandlerInterceptor.super.preHandle(request, response, handler);}//controller 执行后拦截@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}//渲染后拦截@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//在渲染后将 user 从线程中移除UserHolder.removeUser();}
}

第二步,实现线程池工具类,管理登录的 user 

java">public class UserHolder {//user 对应的的线程池private static final ThreadLocal<User> tl = new ThreadLocal<>();//往线程池中存入用户public static void saveUser(User user){tl.set(user);}//拿到当前线程的 user,一个线程只有一个 userpublic static User getUser(){return tl.get();}//移除当前线程的 userpublic static void removeUser(){tl.remove();}}

第三步,使用注解配置类,指定拦截器,并设置放行的请求

java">//使用注解的方式代替配置文件,指定拦截器
@Configuration
public class MvcConfig implements WebMvcConfigurer {//添加拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {//通过 add 添加拦截器,通过 excludePathPatterns 设置不拦截的请求registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("user/code","user/login");}
}

第四步,完善 controller

java">    @GetMapping("/me")//获取当前的 user 并返回public Result me(){//该请求通过拦截器后,线程中会保存 user ,直接返回即可return Result.ok(UserHolder.getUser());}


http://www.ppmy.cn/embedded/119720.html

相关文章

微信小程序公共样式:设计与实现指南

文章目录 前言一、小程序公共样式的概念和作用什么是公共样式&#xff1f;公共样式的作用 二、公共样式的需求分析三、如何编写小程序公共样式3.1 公共样式的命名规范3.2 公共样式的文件结构3.3 公共样式的内容设计局3.3.1 变量定义3.3.2 字体样式3.3.3 按钮样式3.3.4 间距与布…

Day 2 词汇备战

目录 underneath [ˌʌndərˈniːθ] prep. 在……下方&#xff1b;ad. 在底下&#xff0c;底部 infinite [ɪnfɪnət] a. 无限制的&#xff0c;无穷的&#xff0c;极大的&#xff0c;无限 definite [defɪnət] a. 明确的&#xff0c;肯定的&#xff0c;限定的 spy [spaɪ…

ubuntu20.04编译安装opencv-4.9.0的cuda版本

NVIDIA显卡驱动550.107.02&#xff08;4060显卡&#xff1a;8.9&#xff0c;3060显卡&#xff1a;8.6&#xff09;cuda&#xff1a;12.1cudnn&#xff1a;8.9.7opencv4.9.0&#xff0c;opencv_contrib_4.9.0 前三个安装略过&#xff01; 主要编译安装opencv4.9.0: 下载openc…

详解Ajax与axios的区别

Ajax与Axios在Web开发中都是用于发送HTTP请求的技术&#xff0c;但它们在多个方面存在显著的差异。以下是对两者区别的详细解析&#xff1a; 1. 技术原理 Ajax&#xff1a;Asynchronous JavaScript and XML&#xff08;异步JavaScript和XML&#xff09;的缩写&#xff0c;是一…

react-问卷星项目(2)

流程 husky 一个git hook 工具&#xff0c;即在git commit之前执行自定义的命令&#xff0c;将规范流程化&#xff0c;如执行代码风格的检查&#xff0c;避免提交非规范的代码&#xff0c;在github搜索即可。 这两条是接着执行的&#xff0c;表示创建husky&#xff0c;在文档…

基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…

通信工程学习:什么是OFDM正交频分复用

OFDM&#xff1a;正交频分复用 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种在通信领域中广泛应用的多载波调制技术。该技术通过将高速数据流分割成多个低速子流&#xff0c;并在不同频率上同时传输这些子流&#x…

自动化测试常见的面试题(超详细整理)

“ 今天我给大家介绍一些python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助你提升自己的水平和信心。” 项目相关 1.什么项目适合做自动化测试&#xff1f; 答&#xff1a;一般来说&#xff…