技术: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