RESTful token 登陆 (基于 Spring、Redis)

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

为什么使用 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 赞助。

    286 引用 • 248 回帖 • 1 关注
  • Java

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

    3198 引用 • 8215 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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