当前位置: 代码迷 >> 综合 >> springboot微信支付实战------第4章
  详细解决方案

springboot微信支付实战------第4章

热度:107   发布时间:2023-09-05 19:35:31.0

1、单机tomcat应用登录检验
sesssion保存在浏览器和应用服务器会话之间
用户登录成功,服务端会保证一个session,当然会给客户端一个sessionId,
客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId
?
2、分布式应用中session共享
真实的应用不可能单节点部署,所以就有个多节点登录session共享的问题需要解决
1)tomcat支持session共享,但是有广播风暴;用户量大的时候,占用资源就严重,不推荐
2)使用redis存储token:
服务端使用UUID生成随机64位或者128位token,放入redis中,然后返回给客户端并存储在cookie中
用户每次访问都携带此token,服务端去redis中校验是否有此用户即可

 

springboot微信支付实战------第4章

用户登陆生成有一个token,token就是UUID。

1.tomcat的session共享

2.redis就是单点登陆。不是很适合办法大的。

3.还有更好的。

springboot微信支付实战------第4章

---------001-----------------------分布式的session方案----------------------------------

更好的方案:通过加解密算法进行校验的。

 1、JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。
JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名
简单来说,就是通过一定规范来生成token,然后可以通过解密算法逆向解密token,这样就可以获取用户信息
{
“id”:“888“,
“name“:“小D“,
“expire“:“10000“
}   
funtion 加密(object, appsecret){
xxxx
return base64( token);
}
function 解密(token ,appsecret){
xxxx
//成功返回true,失败返回false
}
优点:
1)生产的token可以包含基本信息,比如id、用户昵称、头像等信息,避免再次查库
2)存储在客户端,不占用服务端的内存资源
缺点:
token是经过base64编码,所以可以解码,因此token加密前的对象不应该包含敏感信息
如用户权限,密码等
2、JWT格式组成 头部、负载、签名
header+payload+signature
头部:主要是描述签名算法
负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如iss签发者,exp 过期时间,sub 面向的用户
签名:主要是把前面两部分进行加密,防止别人拿到token进行base解密后篡改token  格式为:xxx.uyuuuuuu.ddddddd
3、关于jwt客户端存储
可以存储在cookie,localstorage和sessionStorage里面

注意前端的:

springboot微信支付实战------第4章

localStroge:本地存储带过期时间。

sessionSyroge:浏览器关闭就没了。

----------------002--------------JWT--------------------------

JWT相关:

<!--JWT相关-->

  <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.7.0</version></dependency>

JWT的核心代码:

package net.xdclass.xdvideo.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import net.xdclass.xdvideo.domain.User;import java.util.Date;public class JwtUtils {private static final String SUBJECT = "xdclass";private static final Long EXPIRE = 1000 * 60 * 60 * 24 * 7L;//过期时间,毫秒private static final String APPSECRET = "xd666";//密钥public static String geneJsonWebToken(User user) {//发行者 定义负载if (user == null || user.getId() == null || user.getName() == null || user.getHeadImg() == null) {return null;}String token = Jwts.builder().setSubject(SUBJECT).claim("id", user.getId()).claim("name", user.getName()).claim("img", user.getHeadImg()).setIssuedAt(new Date())//发行时间.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))//过期时间.signWith(SignatureAlgorithm.ES256, APPSECRET)//签名.compact();//压缩return token;}/*** 校验token** @return*/public static Claims checkJwt(String token) {try {final Claims claims = Jwts.parser().setSigningKey(APPSECRET).parseClaimsJws(token).getBody();return claims;} catch (Exception e) {return null;}}
}

springboot微信支付实战------第4章

加密之后分为三个部分:Header  body  底部是一个签名。

如何使用?

 @Testpublic void testGeneJwt(){User user = new User();user.setId(999);user.setHeadImg("www.xdclass.net");user.setName("xd");String token = JwtUtils.geneJsonWebToken(user);System.out.println(token);}@Testpublic void testCheakJwt(){String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwiaWQiOjk5OSwibmFtZSI6InhkIiwiaW1nIjoid3d3LnhkY2xhc3MubmV0IiwiaWF0IjoxNTc1MjU1NzMxLCJleHAiOjE1NzU4NjA1MzF9.ttiJpVTVg7wtqdi7aaHP7GQ3rGGfqA4O6wPc4UDP1ac";Claims claims = JwtUtils.checkJwt(token);if(claims!=null){System.out.println(claims.get("name"));}else{System.out.println("无");}}

---------------------003-------------JWT实战开发----------