解决session跨域共享问题

Posted zxlsblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决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

导入依赖:
<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());
    

  

 

以上是关于解决session跨域共享问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP解决HTTP和HTTPS跨域共享session的方法及代码实例

解决vue nodejs中cros跨域cookie和session失效的问题

Redis实战和核心原理详解使用Spring Session和Redis解决分布式Session跨域共享问题

跨域时session丢失问题的解决

[转]session 跨域共享方案

Spring Session解决分布式Session问题的实现原理