RESTful token 登陆 (基于 Spring、Redis)

本贴最后更新于 1610 天前,其中的信息可能已经天翻地覆

为什么使用 token

网站服务端在存储用户登陆信息使用 session+cookie.在进行其他客户端通信中使用 cookie 的话操作太繁琐,所以选择 token 这种简易自定义的标识符来进行身份确认.

通信流程

1.客服端通过 post 请求服务端带上用户名密码进行认证,服务端认证通过返回 token,并将 token 存在 redis 数据库中 key 为用户名.
2.客服端在需要权限的请求中带上 token,服务端通过 token 即可判断是那个用户.
3.用户登陆、退出登陆、长时间未操作都会使 token 改变或失效

代码实战

Token 实体类

package com.danbai.ys.entity;

import java.io.Serializable;

/**
 * @author danbai
 * @date 2019-11-21 14:21
 */
public class Token implements Serializable {
    private String username;
    private String token;
    public static final String TOKEN="token_";

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public Token(String username, String token) {
        this.username = username;
        this.token = token;
    }

    @Override
    public String toString() {
        return "Token{" +
                "username='" + username + '\'' +
                ", token='" + token + '\'' +
                '}';
    }

    public Token() {
    }
}

service 接口和实现类

    /**
     * 关联用户和token
     * @param username 用户名
     * @return
     */
    Token createToken(String username);

    /**
     * 检测token有效性
     * @param token
     * @return
     */
    boolean checkToken(Token token);

    /**
     * 删除token
     * @param username
     */
    void deleteToken (String username);
    /**
     * token登陆
     * @param user
     * @return
     */
    Token login(User user);
------------------------------------------------------实现-------------------------------------
 @Override
    public Token createToken(String username) {
        String tokenid= UUID.randomUUID().toString().replace ("-", "");
        Token token=new Token(username,tokenid);
        redisTemplate.opsForValue().set(Token.TOKEN+username,token,7,TimeUnit.DAYS);
        return token;
    }

    @Override
    public boolean checkToken(Token token) {
        if (token == null|token.getUsername()==null|token.getToken()==null|token.getUsername().length()<1|token.getToken().length()<1) {
            return false;
        }
        Token rtoken = (Token) redisTemplate.opsForValue().get(Token.TOKEN+token.getUsername());
        if(rtoken.getToken().equals(token.getToken())){
            // 如果验证成功,说明此用户进行了一次有效操作,延长 token 的过期时间
            redisTemplate.expire(Token.TOKEN+token.getUsername (),7, TimeUnit.DAYS);
            return true;
        }
        return false;
    }

    @Override
    public void deleteToken(String username) {
        redisTemplate.delete(Token.TOKEN+username);
    }

    @Override
    public Token login(User user) {
        if (user != null) {
            User user1 = new User();
            user1.setUsername(user.getUsername());
            User user2 = getUser(user1);
            if (user2 != null) {
                if (DigestUtils.md5DigestAsHex(user.getPassword().getBytes()).equals(user2.getPassword())) {
                    return createToken(user.getUsername());                }
            }
        }
        return null;
    }                                                        
  • token

    令牌、凭证、代币、记号,whatever...

    7 引用 • 14 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 183 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...