网站首页 > 资源文章 正文
一、Token优势
?
1.1 与cookie相比较的优势
1、支持跨域访问,将token置于请求头中,而cookie是不支持跨域访问的;
2、无状态化,服务端无需存储token,只需要验证token信息是否正确即可,而session需要在服务端存储,一般是通过cookie中的sessionID在服务端查找对应的session;
3、无需绑定到一个特殊的身份验证方案(传统的用户名密码登陆),只需要生成的token是符合我们预期设定的即可;
4、更适用于移动端(Android,iOS,小程序等等),像这种原生平台不支持cookie,比如说微信小程序,每一次请求都是一次会话,当然我们可以每次去手动为他添加cookie,详情请查看博主另一篇博客;
5、避免CSRF跨站伪造攻击,还是因为不依赖cookie;
6、非常适用于RESTful API,这样可以轻易与各种后端(java,.net,python......)相结合,去耦合
还有一些优势这里就不一一列举了。
1.2 基于JWT的token认证实现
JWT:JSON Web Token,其实token就是一段字符串,由三部分组成:Header,Payload,Signature。详细情况请自行百度,现在,上代码。
二、加密\解密
?
2.1 pom.xml
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
2.2 加密
//加密的数据
int userId = 51;
//加密的签名
Algorithm algorithm = Algorithm.HMAC256("eyJhbGciO");
//加密头
Map<String, Object> header = new HashMap<String, Object>();
header.put("typ", "JWT");
header.put("alg", "HS256");
try {
//超时时间
Date date = new Date(System.currentTimeMillis() + 30 * 1000);
//令牌token
String token = JWT.create().withHeader(header).withClaim("userId", userId).withExpiresAt(date)
.sign(algorithm);
System.out.println(token);
} catch (Exception e) {
// TODO: handle exception
}
2.3 解密
//前端传过来的令牌
String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1Nzg1NTEyOTgsInVzZXJJZCI6ImhlbGxvIn0.mVXwBkBMO-Sr3FJPZSVLezUuxdvMwNsGgRqTCVufH8o";
//和上面一样的签名
Algorithm algorithm = Algorithm.HMAC256("eyJhbGciO");
JWTVerifier verifier = JWT.require(algorithm).build();
//开始解密,失败的话会出现异常
DecodedJWT jwt = verifier.verify(token);
System.out.println(jwt.getClaim("userId").asInt());
三、封装工具类JWTUtil
?
public class JWTUtil {
private static final String TOKEN_SECRET = "eyJhbGciO";
private static final String CLAIM_NAME = "sign";
private static final long EXPIRE_TIME = 15 * 60 * 1000;
public static String sign(String sign) {
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
Map<String, Object> header = new HashMap<String, Object>();
header.put("typ", "JWT");
header.put("alg", "HS256");
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
String token = JWT.create().withHeader(header).withClaim(CLAIM_NAME, sign).withExpiresAt(date)
.sign(algorithm);
return token;
} catch (Exception e) {
return null;
}
}
public static String verify(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
return jwt.getClaim(CLAIM_NAME).asString();
} catch (Exception e) {
return null;
}
}
}
山东掌趣网络科技
猜你喜欢
- 2024-10-02 Java 如何用 token 做用户登录认证
- 2024-10-02 Salesforce | 平台初级开发 Platform Developer Ⅰ 认证考试指南
- 2024-10-02 what?面试官让我用30秒给他讲清楚什么是 Session-Cookie 认证?
- 2024-10-02 Java安全模型之——代码签名和认证
- 2024-10-02 使用JAVA + Mysql 设计考试系统(java使用mysql用哪个版本)
- 2024-10-02 我最喜欢的Java好书,还是这几本(java书推荐 知乎)
- 2024-10-02 海口达内:如何提高Java编码技能,这里有捷径
- 2024-10-02 零基础菜鸟如何自学Java(零基础怎么学java)
- 2024-10-02 SpringSecurity和JWT实现认证和授权
- 2024-10-02 javaweb的四种认证机制(java认证中心)
你 发表评论:
欢迎- 05-1430个在线地图瓦片URL分享
- 05-1425个在线地图瓦片URL分享
- 05-14PixelStyle for Mac(mac照片编辑器)
- 05-14一篇文章带你了解CSS3 3D 转换知识
- 05-14我们的世界是假的?马斯克:我们生活在高文明模拟的矩阵游戏中
- 05-14【视觉AI的基石】斯坦福大学笔记!带你吃透卷积神经网络 (CNN)
- 05-14潮流 | 通过AAPE的新价目,无虑入荷未来主义服饰
- 05-14身份证查询服务API:准确识别身份证信息
- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)