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

登录拦截器

目录

🎈1.登陆拦截器的使用

🎊2.ThreadLocal的简单使用

🎃3.登录拦截器拦截和放行配置 


1.登陆拦截器的使用

创建一个拦截器类,必须让其实现HandlerInterceptor接口

1.获取前端的token

2.判断token是否为空

3.若为空,返回json数据给前端

4.如不为空,校验解析token看是否与登陆者的一直,获取信息

5.将获取的信息,封装为UserDo对象

6.使用ThreadLocal传递信息

/*** 登录拦截器*/
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {public static ThreadLocal<LoginUser> threadLocal=new ThreadLocal<>();/*** 登录校验** @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取前端的tokenString token = request.getHeader("token");if (token == null) {token = request.getParameter("token");}//判断token是否为空if (StringUtils.isNotBlank(token)) {//不为空,解密tokenClaims claims = JwtUtil.checkToken(token);if (claims == null) {//未登录,返回json数据CommonUtil.sendJsonMessage(response, CodeEnum.ACCOUNT_NO_LOGIN);}//解密登录对象的各种信息Long loginUserId = Long.valueOf(claims.get("id").toString());String loginUserHeadImage = String.valueOf(claims.get("head_image"));String loginUserMail = String.valueOf(claims.get("mail"));String loginUserName = String.valueOf(claims.get("name"));//将获取的登录对象的各种信息封装为loginUser,方便使用LoginUser loginUser = new LoginUser();loginUser.setName(loginUserName);loginUser.setMail(loginUserMail);loginUser.setHeadImg(loginUserHeadImage);loginUser.setId(loginUserId);//使用threadLocal传递用户信息threadLocal.set(loginUser);//返回true,return true;}CommonUtil.sendJsonMessage(response, CodeEnum.ACCOUNT_NO_LOGIN);return false;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}
  • 如果没有token,说明未登录,给前端返回json数据,调用指定的json转换方法
  /*** 返回json数据给前端** @param response* @param object*/public static void sendJsonMessage(HttpServletResponse response, Object object) {//Json序列化ObjectMapper objectMapper = new ObjectMapper();//设置HTTP响应的Content-Type头部response.setContentType("application/json; charset=utf-8");//获取获取输出流try (PrintWriter writer = response.getWriter()) {writer.print(objectMapper.writeValueAsString(object));response.flushBuffer();log.info("返回json成功");} catch (IOException e) {e.printStackTrace();log.warn("相应json数据异常:{}",e);}}
  • 思考了一个问题: threadLocal的使用属于单例模式中的饿汉式吗????

答案:不是的
大佬的回答:  在 LoginInterceptor 类中,threadLocal 被定义为一个静态变量,并且使用了饿汉式初始化,即在类加载的时候就完成了 ThreadLocal 对象的创建。然而,这并不意味着它是单例模式的实现。单例模式关注的是确保一个类只有一个实例,而 ThreadLocal 关注的是线程间的数据隔离。

2.ThreadLocal的简单使用

  • ThreadLocal 的主要目的是为每一个线程提供一个独立的变量副本,而不是确保整个应用程序只有一个实例。
  • ThreadLocal 的设计是为了解决多线程环境下的数据隔离问题。当多个线程共享同一个对象时,如果不加控制,线程间的数据可能会互相干扰。使用 ThreadLocal 可以让每个线程都拥有自己独立的数据副本,从而避免线程间的数据冲突。

总结:同个线程共享数据

3.登录拦截器拦截和放行配置 

  • 创建拦截器的配置类,一定要实现WebMvcConfiguer接口;
  • 重写addInterceptors()方法
  • 设置指定的拦截器,并添加相应的拦截路径即可
@Slf4j
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {/*** 创建loginInterceptor拦截器对象* @return*/@Beanpublic LoginInterceptor loginInterceptor(){return new LoginInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//指定拦截器registry.addInterceptor(loginInterceptor())//需要拦截的路径.addPathPatterns("/api/user/*/**","/api/address/*/**")//排除不需要拦截的路径.excludePathPatterns("/api/user/*/send_code","/api/user/*/captcha","/api/user/*/login","/api/user/*/register","/api/user/*/upload");}
}

相关文章:

  • unity无法使用道路生成插件Road Architect(ctrl和shift无法标点)
  • SAP_MMQM模块-采购收货质量控制
  • 【八股】泛型
  • 深度学习pytorch——激活函数损失函数(持续更新)
  • SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索
  • 【系统架构师】-第12章-信息系统架构
  • Python基础中易错点分享
  • UE4_旋转节点总结一
  • ubuntu16 apt安装程序锁死解决
  • opencv 十九 python下实现多线程间rtsp直播流的复用
  • Games104 听后笔记
  • 利用python搭建临时文件传输服务
  • 《自动机理论、语言和计算导论》阅读笔记:p5-p27
  • Microsoft Word 快捷键 (keyboard shortcut - hotkey)
  • C# 高级文件操作与异步编程探索(初步)
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 「面试题」如何实现一个圣杯布局?
  • DOM的那些事
  • JavaScript 一些 DOM 的知识点
  • jdbc就是这么简单
  • k8s 面向应用开发者的基础命令
  • LeetCode18.四数之和 JavaScript
  • php中curl和soap方式请求服务超时问题
  • python 学习笔记 - Queue Pipes,进程间通讯
  • scrapy学习之路4(itemloder的使用)
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Yeoman_Bower_Grunt
  • 代理模式
  • 聚类分析——Kmeans
  • 利用DataURL技术在网页上显示图片
  • 如何在 Tornado 中实现 Middleware
  • 数据可视化之 Sankey 桑基图的实现
  • 双管齐下,VMware的容器新战略
  • 我与Jetbrains的这些年
  • 详解NodeJs流之一
  • 数据库巡检项
  • ​flutter 代码混淆
  • #if #elif #endif
  • ${factoryList }后面有空格不影响
  • (+4)2.2UML建模图
  • (1)(1.11) SiK Radio v2(一)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (SpringBoot)第二章:Spring创建和使用
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (篇九)MySQL常用内置函数
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)Android布局类型(线性布局LinearLayout)
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)appium-desktop定位元素原理
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ***检测工具之RKHunter AIDE
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core中的去虚