植物病虫害识别系统–––登录模块

技术:ThreadLocal本地线程

jwt会话追踪技术

http协议:无状态协议(多个请求之前没有任何联系,一个请求对应一个响应),对事务处理没有记忆能力

在京东网站

http没有记忆能力,登录成功就是一个请求,访问购物车也是一个请求,但是请求是并发的,一次可以发送多个请求,原生的http登录后仍然不能访问购物车,所以使用会话追踪技术,把已经登录了的状态共享给后面所有的请求,如购物车

也就是在请求链A--B--C中,不同的方法可以调用这个token信息,不用多次解析令牌

去自己的变量副本中修改自己的副本,不影响其他线程

前端会去Tomcat容器中,取出一个线程处理该请求,controller层,service层,mapper层就是这个请求,处于同一个线程

校验:登录后其他所有的请求

算子模块,数据字典模块等都是登录后才能访问的

也就是登录成功(拿到一个json web token令牌)才能访问后面的业务

不是正确的用户和密码,会进行拦截

1.验证成功:会生成jwt令牌(包含用户id,用户名),验证用户身份的这样一个令牌

2.然后将JWT返回给前端,前端存在本地,后续要访问其他模块,前端直接将jwt添加到请求头(key:Authorization头)中,value:token,下次访问其他模块校验时直接将其发送给后端

3.后端对Authorization中的token进行解析,并校验

前端:访问算子模块 不让访问,有墙,判断用户身份,java拦截器springmvc提供,过滤器优先于拦截器,用户未登录,就不让进,成功会返回jwt令牌,临时存起来,前端将JWT存储在本地(如 LocalStorage、Cookie 等)

jwt保存在这,右键--检查--应用程序--本地存储空间cookie

登录只在访问登录时叫做登录,访问其他模块叫校验

当访问其他模块时就是携带者请求头中的token令牌访问的

如果在请求体拿令牌,有的话,需要验证令牌是否有效,登录是否过期,通过验证才能能访问那些模块,也就是后端:登录接口,算子模块,模型模块,日志模块接口

拦截器springMVC提供

过滤器(优先级高)javaWeb中三剑客servlet,filter,监听器提供

放行才能共享threadlocal数据

4.2使用

创建存储用户信息的threadlocal工具类

finally修饰的是静态常量

登录模块

令牌:data中的数据 是用.分割成三段,不能放密码等敏感信息

第一段:头部

第二段:载荷

第三段:签名

怎么生成jwt?

1.引入依赖jwt

2.在JwtUtils(可以复用)工具包中封装签名密钥

同时设置过期时间

map集合:键值对形式

map中不能存放敏感信息,放的是是载荷部分

compact颁发令牌

解析jwt--parseJWT

第一个异常是用户登录过期

test下创建jwt包--新建jwtTest测试生成一个令牌,生成一个jwt

存的越多令牌越长

jwt解析内容parseJWT

jwtutils补充异常

如果令牌有一个字母错就需要捕获异常在jwtutils中添加异常

登录:验证用户名和密码是否正确 验证不通过,返回异常,用户名密码错误,账号被封禁

验证成功 :返回一个jwt给到客户端响应回去

前端填写好信息 统一发送,由客户端发起登录请求到后端,登录成功,后端校验信息正确 颁发jwt给到客户端,客户端拿到后将jwt保存在cookie,localstorage,保存令牌信息,登录结束,

必须在接口文档拿到令牌,才能进行后续的访问其他模块

logincontroller开始写

然后去实现类实现具体业务

然后进行校验:拿到令牌后对令牌解析,进行校验用户信息

登录之后的其他所有被访问的资源,包含后端接口,查询,退出等,都需要先验证用户身份,然后再判断,身份认证成功,可以访问我们的后端资源,身份认证失败,那么就直接拦截,拦截器(过滤器)请求,进行统一处理

jwt保存在了前端的cookie中,认证通过的jwt信息,前端每次携带发送请求,在请求头放这jwt信息,后端要拿到原始请求,拿到请求头,解析jwt,拿到当前用户ID,及其他用户信息,及验证用户身份

继续写获取当前用户信息的接口

在pai下新建包interceptor 再建一个类LoginCheckInterceptor

拦截器interceptor

preHandle实现统一拦截

登录不能拦截,注册不能拦截,接口文档,不登录也要能访问,所以在配置中书写拦截的规则

config下新建一个WebConfig

/**代表拦截所有后端

登录,手机号,发送短信验证码不拦截,doc接口文档中的一些内容不要拦截

业务一:账号密码登录

业务二:获取当前登录用户信息

preHandle中已经将id放在ThreadLocal中,service层直接就能取到用户id通过convert转化成想拿到的vo对象,vo中有userId,userName,headUrl

业务三:退出登录

前端把cookie删除就把令牌删了,自然就登不上去了

我们点击退出登录,前端自动把cookie中内容删除 在controller就实现了

bug:想增加一个字典数据demo1,发现服务器内部错误

options探路 发送通过 就是判断能不能和后端通信 成功才会发生真实的请求

预检请求没有真实的请求头信息

也不需要拦截预检请求

我们要在prehandle中把预检请求options过滤掉,不需要拦截

注意:新增,修改 Redis中数据也会同步,要启动Redis

相关推荐
万亿少女的梦1681 小时前
基于Spring Boot与Vue的繁星技术论坛系统设计与实现
java·spring boot·mysql·vue·系统设计
万亿少女的梦16820 小时前
基于SpringBoot的考研学习交流系统设计与开发
spring boot·mysql·vue·系统设计·论坛系统
二宝哥1 天前
创建Gradle多模块SpringBoot项目
java·spring boot·后端
杨运交1 天前
[044][Web模块]基于 Google Authenticator 的 TOTP 双因素认证框架设计与实现
spring boot
二宝哥1 天前
springboot项目使用Gradle工具实现依赖版本控制
java·spring boot·后端·gradle·版本
卓怡学长1 天前
w273基于springboot的智能笔记的开发与应用
java·spring boot·spring·intellij-idea
Kyrie_Li1 天前
Spring Boot Kafka 生产级配置全解析:从入门到精通
spring boot·后端·kafka
小强库计算机毕业设计2 天前
源码分享Spring Boot + Vue3 的校园社团管理系统
java·spring boot·后端·计算机毕业设计