Session与Token

Session和token是网络连接中常用到的两种机制,一般用来保持连接的客户端信息,但两种实现存在差异。

session

session是由Web服务器维护的一种连接信息,可以用来存储当前连接的客户端相关信息。session默认超时时间为30分钟,可进行配置。使用postman进行接口测试时,每次连接使用一个新的session。如果两个连接想使用同一个session,可以在将第一个请求返回的JSession(见图一),放在第二个请求的header中添加的cookie里(见图二)。
Session与Token_第1张图片
Session与Token_第2张图片
例如,当用户登录成功时,在session里保存用户信息

httpSession.setAttribute("curUser", dbUser);

在连接中获取用户信息

BUserInfo curUser = (BUserInfo) httpSession.getAttribute("curUser");

token

token是一种令牌口令,一般由header、body、signature三部分组成。当客户端登录到服务器时,由服务器生成,返回给客户端,并在服务器的缓存或数据库保存签名。token的生成会用到用户信息,并使用一个密钥按某种算法加密,并可以设置过期时间。当客户端再次连接服务器时,带上token,服务器端通过验证并解析出用户信息即可,省去了每次需要传输用户名、密码的烦恼。

token工具示例如下:

public class JwtUtils {
    private final static String key = "project";
    private final static Long ttl = 43200000L;//12小时

    /**
     * 设置认证token
     *      id:登录用户id
     *      name:登录用户名
     *
     */
    public static String createJwt(String id, String name, Map<String,Object> map) {
        //1.设置失效时间
        long now = System.currentTimeMillis();//当前毫秒
        long exp = now + ttl;
        //2.创建jwtBuilder
        JwtBuilder jwtBuilder = Jwts.builder().setId(id).setSubject(name)
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256, key);
        //3.根据map设置claims
        for(Map.Entry<String,Object> entry : map.entrySet()) {
            jwtBuilder.claim(entry.getKey(),entry.getValue());
        }
        jwtBuilder.setExpiration(new Date(exp));
        //4.创建token
        String token = jwtBuilder.compact();

        return token;
    }

    /**
     * 解析token字符串获取clamis
     */
    public static Claims parseJwt(String token) {
        Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();

        return claims;
    }

}

session与token区别

session由服务器维护,使用简单,只能单服务器使用。token需要程序实现生成,略显复杂,但可以用于分布式场景。

你可能感兴趣的:(Java)