怎么吃透一个java项目? - 知乎 (zhihu.com)https://www.zhihu.com/question/422346147
java开发做项目的思路
学习Java如何开始第一个项目?
学习Java如何开始第一个项目? - 知乎 (zhihu.com)https://www.zhihu.com/question/320165362
1.jjwt组件认识
官网:GitHub - jwtk/jjwt: Java JWT: JSON Web Token for Java and Android
jjwt:JSON Web Token for Java and Android
token:令牌,一个加密后的字符串而已.字符串中含有的信息(用户标识,令牌签发时间,有效时间,防伪标志).
jjwt:用来对明文的json格式的token字符串按照指定的秘钥进行加密,生成一套token密文字符串.
token应用场景:
-
有时效性的url连接:邮箱重置密码.账号激活.
-
登录校验
-
用户登录成功后,把登录用户对象保存到HttpSession对象中,在登录 拦截中,从HttpSession中获取到登录用户对象,有的话,则代表已登录,没有则代表未登录.一旦引入了tomcat分布式部署,则使用session来存储登录用户进行登录 校验就有问题.如何解决?
-
使用spiring-session组件,该组件基于redis服务器来存储HttpSession对象达到session共享的目的;
-
不使用HttpSession对象,使用token令牌机制来进行登录校验.
-
-
-
接口权限控制
-
在访问接口时,接口地址中带有token信息;
-
拦截器校验token,校验合法性,校验通过了,则根据token中的用户标识,获取该用户是否有权限访问此接口.
-
2.编写jjwt工具类
jjwt组件对应的token格式:
{"alg":"加密算法名称"}.{"issuedAt":"生成时间","Expiration":"过期时间","uid":"用户标识"...}.{body对应的密文}
header(算法名).body(签名信息,标准签名,自定义签名).对body按照header指定的算法,生成密文字符串.
一个jjwt的token字符串:算法名.明文.密文
jjwt还要复杂校验token.:对明文再次按照算法,使用秘钥进行加密,比对新生成的密文与之前的密文是否 一致.
-
添加jjwt组件依赖
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jjwt.version}</version> </dependency>
-
编写生成token方法
-
编写解析token方法
3.登录校验控制
-
登录成功后,生成token.并通过响应头返回客户端;
在跨域请求中,自定义的响应头,是无法正常返回客户端的,因为在CorsFilter中,并没有配置响应头策略,需要在跨域过滤器中配置exposedHeaders允许服务端返回的响应头
-
客户端保存token
在axios的响应拦截中判断响应头中是否包含admin_token响应头;有的话,则获取并保存
-
客户端新的请求,要携带token,发送至服务端;
token放在请求头,发送服务端;请求体放的都是请求业务数据.
-
服务端拦截器要校验token合法性.
拦截器要获取请求头中的admin_token令牌. 对token进行校验,未通过,返回重登录. 通过的话,要从redis中获取登录用户对象,并把该对象加入线程变量. 还需要在拦截器中对token进行刷新,延迟到期时间 前端在响应拦截中对服务单拦截器返回的重新登录,要进行处理.