1+ import org .apache .commons .codec .binary .Hex ;
2+ import redis .clients .jedis .Jedis ;
3+ 4+ import java .security .MessageDigest ;
5+ import java .security .NoSuchAlgorithmException ;
6+ import java .time .Instant ;
7+ import java .util .Random ;
8+ 9+ 10+ public class LoginSession {
11+ 12+ private final String SESSION_TOKEN_KEY = "SESSION:TOKEN" ;
13+ private final String SESSION_EXPIRE_TS_KEY = "SESSION:EXPIRE" ;
14+ 15+ private final String SESSION_NOT_LOGIN = "SESSION_NOT_LOGIN" ;
16+ private final String SESSION_EXPIRE = "SESSION_EXPIRE" ;
17+ private final String SESSION_TOKEN_CORRECT = "SESSION_TOKEN_CORRECT" ;
18+ private final String SESSION_TOKEN_INCORRECT = "SESSION_TOKEN_INCORRECT" ;
19+ 20+ private Jedis client ;
21+ private String userId ;
22+ 23+ public LoginSession (Jedis client , String userId ) {
24+ this .client = client ;
25+ this .userId = userId ;
26+ }
27+ 28+ /**
29+ * 生成随机token
30+ *
31+ * @return token
32+ */
33+ private String generateToken () {
34+ byte [] b = new byte [256 ];
35+ new Random ().nextBytes (b );
36+ 37+ MessageDigest messageDigest ;
38+ 39+ String sessionToken = "" ;
40+ try {
41+ messageDigest = MessageDigest .getInstance ("SHA-256" );
42+ byte [] hash = messageDigest .digest (b );
43+ sessionToken = Hex .encodeHexString (hash );
44+ } catch (NoSuchAlgorithmException e ) {
45+ e .printStackTrace ();
46+ }
47+ return sessionToken ;
48+ }
49+ 50+ /**
51+ * 创建会话,并返回token
52+ *
53+ * @param timeout 过期时长
54+ * @return token
55+ */
56+ public String create (int timeout ) {
57+ String token = generateToken ();
58+ long expireTime = Instant .now ().getEpochSecond () + timeout ;
59+ client .hset (SESSION_TOKEN_KEY , userId , token );
60+ client .hset (SESSION_EXPIRE_TS_KEY , userId , String .valueOf (expireTime ));
61+ return token ;
62+ }
63+ 64+ public String create () {
65+ // 设置默认过期时长
66+ int defaultTimeout = 30 * 24 * 3600 ;
67+ return create (defaultTimeout );
68+ }
69+ 70+ /**
71+ * 校验token
72+ *
73+ * @param token 输入的token
74+ * @return 校验结果
75+ */
76+ public String validate (String token ) {
77+ String sessionToken = client .hget (SESSION_TOKEN_KEY , userId );
78+ String expireTimeStr = client .hget (SESSION_EXPIRE_TS_KEY , userId );
79+ 80+ if (sessionToken == null || expireTimeStr == null ) {
81+ return SESSION_NOT_LOGIN ;
82+ }
83+ 84+ Long expireTime = Long .parseLong (expireTimeStr );
85+ if (Instant .now ().getEpochSecond () > expireTime ) {
86+ return SESSION_EXPIRE ;
87+ }
88+ 89+ if (sessionToken .equals (token )) {
90+ return SESSION_TOKEN_CORRECT ;
91+ }
92+ return SESSION_TOKEN_INCORRECT ;
93+ }
94+ 95+ /**
96+ * 销毁会话
97+ */
98+ public void destroy () {
99+ client .hdel (SESSION_TOKEN_KEY , userId );
100+ client .hdel (SESSION_EXPIRE_TS_KEY , userId );
101+ }
102+ }
0 commit comments