方案一:采用redis集群
架构:
浏览器 ---> Nginx ---> 应用集群 ---> redis集群
首次登录时,服务器端生成token,存入redis,并将token返回给客户端(浏览器), 然后浏览器每次访问服务器端时都会携带token, 应用服务器携带token会访问redis集群,如果根据token查到用户相关信息,则说明是已登录状态
代码略
-----------------------------------------------------------------------------------------------------------------------------------------------
方案二:采用JWT
架构
浏览器 ---> Nginx ---> 应用集群 ---> JWT
首次登录时,服务器端通过Jwt加密算法生成token,并返回给客户端(浏览器),然后浏览器每次访问服务器端时都会携带token,应用服务器会通过Jwt解密算法对token进行解密操作,如果解密成功获取到用户相关信息,则说明是已登录状态
package net.jwt.utils;
import io.jsonwebtoken.*;
import net.jwt.domain.User;
import java.util.Date;
public class JwtUtil {
private static final String SUBJECT = "jiajing"; //发布者
private static final Long EXPIRE = 1000 * 60 * 60 * 24 * 7L;//一周后过期
private static final String APPSECRET = "jjjjj";//密钥
/**
* 生成jwt(加密)
* @return 返回token
*/
public static String createJsonWebJwt(User user) {
String token = Jwts.builder().setSubject(SUBJECT)
.claim("id", user.getId()) //
.claim("name", user.getName())
.claim("phone", user.getPhone())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.signWith(SignatureAlgorithm.HS256, APPSECRET)
.compact();
return token;
}
/**
* 校验token(解密)
* @param token
* @return
*/
public static Claims checkJwt(String token) {
try {
Claims claims = Jwts.parser().setSigningKey(APPSECRET)
.parseClaimsJws(token).getBody();
return claims;
} catch (Exception e) {
System.out.println("非法");
}
return null;
}
}
<!-- JWT相关 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>