java session跨域_解决session跨域共享问题

解决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

导入依赖:

joda-time

joda-time

2.9.9

com.auth0

java-jwt

3.3.0

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 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 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 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());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值