最近,一个小项目连接到两个部分:前后。前台嵌入了小程序中。背景中有一个简单的管理接口。由于权限要求很简单,并且不需要权限的逻辑。
因为项目功能非常简单,并且在后期的可伸缩性不强,所以前端和后端分离是分开的,基本框架只是使用Springboot使用Springboot提供最基本的RES界面,而无需使用Microservices。类似于使用SpringCloud
会话+cookie的共享方案是一种传统的解决方案机制,需要将其引入弹簧,春季安全和其他依赖性。如果您不这样做,请参考:https://juejin.cn/post/6844903858285831
以下令牌和JWT相似。两者都是由用户信息生成的,以生成一个字符串以传递前端。前端需要在要求时携带令牌。不同之处在于,JWT本身携带用户信息并到期时间,而JWT本身也不状态。因此,与令牌相比,优势是无需保存用户信息,并且需要将令牌方法保存在服务器上。通常在Redis中,JWT只需要在JWT中检查和获取用户信息。
缺点是JWT有一个到期时间,并且在续订期间需要更换整个令牌。目前,需要更新前端合作。此外,由于JWT的不统计,令牌在登录后的有效期内仍然有效。以这种方式存在某些问题。实际上,它违反了JWT的最初意图。因此,我认为JWT更适合一个时间验证业务流程,而不是登录会话的管理,因为用户登录行为本身是与JWT发生冲突。
在Springboot上,有三个可选的拦截解决方案:
现在制作了此记录,这里均匀地用来添加令牌
1.添加过滤器
2.添加配置项目以将拦截器配置为项目
它的原理类似于过滤器。区别在于拦截器属于SpringMVC截距,并且过滤器属于Sevlet拦截器。实施方法如下:
另外:配置配置项目
此拦截器的想法是因为所有界面均由@RestController或@controller发出,因此您可以通过切割注释来拦截所有请求。对于白名单的设置,您可以设置注释以确定是否添加了呼叫接口。可以过滤此注释。对于无需登录的接口,只需添加注释即可。
1.添加免费登录笔记
添加与AOP相关的依赖关系
添加切割点并通过周围的增强拦截
将注释添加到不需要验证的接口中,例如:
由于每个接口都是一个独立的线程,因此为了促进获得用户信息,我们考虑使用threadlocal使用空间来使用时间。将信息放在线程中,您可以随时获取信息。
关于ThreadLocal首先查看此类的API:https://docs.oracle.com/javase/8/docs/api/java/java/langlocal.html
它的核心想法是:共享变量在每个线程中都有一个副本,每个线程都由其自己的副本操作,这对另一个线程没有影响。
线程局部称为线程变量,这意味着填充在线程列中的变量属于当前线程。对于其他线程,该变量是隔离的,这意味着变量是当前线程的唯一变量。ThreadLocal为每个线程中的变量创建一个副本,因此每个线程可以访问其内部副本变量。
螺纹变量,本地变量和同一线程中包含的对象在不同的线程中具有不同的副本。这里有几点要注意:
因为每个线程都有自己的副本,并且该副本只能由当前线程使用。这也是ThreadLocal的起源
ThreadLocal提供了一个线程的局部示例。它和普通变量之间的差异是,使用该变量的每个线程都作为完全独立的实例副本初始化。ThreadLocal变量通常通过private static修改。可以回收使用的相对实例副本。
通常,线程局部适用于需要其独立实例的每个线程,并且需要在多种方法中使用此实例,即通过线程之间的可变间隔隔离并在方法或类之间共享的情况。
推荐文章此处:https://juejin.cn/post/709777548593189901#heading-9,简介更详细,并且不重复。
在这里直接使用:
现在,将转换方法建立一个工具类,该工具类是一个线程插座对象,该对象存储用户信息:
然后改变上述表面
请注意:使用threadLocal记住删除!交叉启动删除内存泄漏
在原始设计中,令牌使用UUID方法,将UUID用作REDIS中的密钥,用户信息以REDIS作为值存储。此方法有一个问题。仅允许用户在一台设备中登录。这是我的转型计划的记录。当然,有更好的解决方案,欢迎您提出建议。
计划原则:
核心代码:
原始:https://juejin.cn/post/70997335217148935
