标签:text except date 加密算 vat 规范 身份认证 obj payload
解决session跨域共享问题
1. session sticky :会话保存在单机上 保证会话请求落在同一台服务器上
2. session replication:session 复制 每一台服务器上都保持一份相同的session (造成额外的存储开销和网络开销)
3. session 集中存储 :存储在db、 存储在缓存服务器 (redis)
4. 基于cookie (主流)
4.1>>>>
access_token(userid/token/timestamp(过期时间) 加密) 将access_token存储在客户端的cookie中 每次 客户端过来访问
服务器端拦截其中 获取cookie中的access_token 根据 userid和timestamp(过期时间) 判断是否有效
4.2>>>>基于JWT的解决方案 《json web Token》
json web Token 客户端和服务端信息安全传递,身份认证的一种解决方案。用在登陆上
jwt由三个组成:header,payload 载荷,signature
·header{
typ:"jwt" //类型
alg:"HS256" //加密算法
}
·payload :jwt本身规范提供的格式 claims
{
iss:“签发者”
iat:“签发时间”
exp:“过期时间”
sub:
}
可以自己定一些claims,放入自定义的信息如 uid 等
·signature: 将 header+ payload 组合成为一个字符串
Base64(header).Base64(payload) + head中定义的算法 +密钥 生成一个字符串 str.签名字符串 就是 JWT的token
导入依赖:
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.9</version>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.3.0</version>
JWTutil代码:
public class JWTTokenUtil { private static final String JWT_KEY_USER_ID="JWT_KEY_USER_ID"; private static final int EXPIRED_TIME=6000; private static final String SECRET_KEY="tengvincent_user"; public static String generatorToken(Long userId)throws Exception{ //header Map Map<String,Object> headerMap=new HashMap<>(); headerMap.put("typ","JWT"); headerMap.put("alg","HS256"); String token=JWT.create() .withHeader(headerMap) .withClaim("iss","Service")//签发者 .withClaim("aud","APP") .withClaim(JWT_KEY_USER_ID,userId) .withIssuedAt(DateTime.now().toDate())//sign time .withExpiresAt(DateTime.now().plusMinutes(EXPIRED_TIME).toDate())//expired time .sign(Algorithm.HMAC256(SECRET_KEY)); return token; } public static Map<String,Claim> varifyToken(String token){ DecodedJWT jwt=null; try{ JWTVerifier verifer= JWT.require(Algorithm.HMAC256(SECRET_KEY)).build(); jwt=verifer.verify(token); }catch (Exception e){ // e.printStackTrace(); // token 校验失败, 抛出Token验证非法异常 } return jwt.getClaims(); } public static Long getTokenInfo(String token){ Map<String, Claim> claims = varifyToken(token); Claim user_id_claim = claims.get("user_id"); if (null == user_id_claim || StringUtils.isEmpty(user_id_claim.asString())) { // token 校验失败, 抛出Token验证非法异常 } return Long.valueOf(user_id_claim.asString()); } }
标签:text except date 加密算 vat 规范 身份认证 obj payload
原文地址:https://www.cnblogs.com/zxlsblog/p/11296192.html