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

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

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

第一步,写一个拦截器类

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 

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();}}

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

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

第四步,完善 controller

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

相关文章:

  • Qt 每日面试题 -6
  • LVS+keepalived整合负载均衡配置
  • 物理学基础精解【41】
  • MySql中索引失效的情况及原因
  • CSS开发全攻略
  • ubuntu2204操作系统使用可执行文件方式安装docker-compose记录
  • Qt网络编程——QUdpSocket
  • [大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成
  • [C++][程序退出]详细讲解
  • C++【类和对象】(取地址运算符重载与实现Date类)
  • Jenkins提示Host key verification failed的解决办法
  • RabbitMQ 消息队列:生产者与消费者实现详解
  • how to remove the text shadow under app icon on Windows
  • Java 编码系列:反射详解与面试题解析
  • 更新系统提示“系统备份失败”
  • php的引用
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • cookie和session
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascript 原型链
  • JDK9: 集成 Jshell 和 Maven 项目.
  • php ci框架整合银盛支付
  • quasar-framework cnodejs社区
  • ReactNative开发常用的三方模块
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 第十八天-企业应用架构模式-基本模式
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 工作中总结前端开发流程--vue项目
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于使用markdown的方法(引自CSDN教程)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 学习使用ExpressJS 4.0中的新Router
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • !!Dom4j 学习笔记
  • #Ubuntu(修改root信息)
  • (26)4.7 字符函数和字符串函数
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Oracle)SQL优化技巧(一):分页查询
  • (SERIES10)DM逻辑备份还原
  • (四)js前端开发中设计模式之工厂方法模式
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ***利用Ms05002溢出找“肉鸡
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .form文件_一篇文章学会文件上传
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Framework杂记
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET 通过系统影子账户实现权限维持
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET实现之(自动更新)