解決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());
    }
}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM