Java的JJWT实现JWT.

JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache

License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。

下面就来测试一下代码和步骤:

token的创建

(1)创建maven工程,引入依赖

io.jsonwebtoken

jjwt

0.6.0

(2)创建类CreateJwtTest,用于生成token

public class CreateJwtTest {

public static void main(String[] args) {

JwtBuilder builder= Jwts.builder().setId("888")

.setSubject("小白")

.setIssuedAt(new Date())

.signWith(SignatureAlgorithm.HS256,"itcast");

System.out.println( builder.compact() );

}

}

setIssuedAt用于设置签发时间

signWith用于设置签名秘钥

(3)测试运行,输出如下:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1MjM0M

TM0NTh9.gq0J‐cOM_qCNqU_s‐d_IrRytaNenesPmqAIhQpYXHZk

token的解析

我们刚才已经创建了token ,在web应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个token(这就好像是拿着一张门票一样),那服务端接到这个token 应该解析出token中的信息(例如用户id),根据这些信息查询数据库返回相应的结果。创建ParseJwtTest:

public class ParseJwtTest {

public static void main(String[] args) {

String token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiO

jE1MjM0MTM0NTh9.gq0J‐cOM_qCNqU_s‐d_IrRytaNenesPmqAIhQpYXHZk";

Claims claims =Jwts.parser().setSigningKey("itcast").parseClaimsJws(token).getBody();

System.out.println("id:"+claims.getId());

System.out.println("subject:"+claims.getSubject());

System.out.println("IssuedAt:"+claims.getIssuedAt());

}

}

试着将token或签名秘钥篡改一下,会发现运行时就会报错,所以解析token也就是验证token

setExpiration 方法用于设置过期时间

测试运行,当未过期时可以正常读取,当过期时会引发

io.jsonwebtoken.ExpiredJwtException异常。

自定义claims

我们刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以定义自定义claims 创建CreateJwtTest3

public class CreateJwtTest3 {

public static void main(String[] args) {

//为了方便测试,我们将过期时间设置为1分钟

long now = System.currentTimeMillis();//当前时间

long exp = now + 1000*60;//过期时间为1分钟

JwtBuilder builder= Jwts.builder().setId("888")

.setSubject("小白")

.setIssuedAt(new Date())

.signWith(SignatureAlgorithm.HS256,"itcast")

.setExpiration(new Date(exp))

.claim("roles","admin")

.claim("logo","logo.png");

System.out.println( builder.compact() );

}

}

当我们使用SpringBoot 来实现时,一般把JWT验证放在常用子系统的模块的工具类中,

@ConfigurationProperties("jwt.config")

public class JwtUtil {

private String key ;

private long ttl ;//一个小时

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public long getTtl() {

return ttl;

}

public void setTtl(long ttl) {

this.ttl = ttl;

}

/**

* 生成JWT

*

* @param id

* @param subject

* @return

*/

public String createJWT(String id, String subject, String roles) {

long nowMillis = System.currentTimeMillis();

Date now = new Date(nowMillis);

JwtBuilder builder = Jwts.builder().setId(id)

.setSubject(subject)

.setIssuedAt(now)

.signWith(SignatureAlgorithm.HS256, key).claim("roles",

roles);

if (ttl > 0) {

builder.setExpiration( new Date( nowMillis + ttl));

}

return builder.compact();

}

/**

* 解析JWT

* @param jwtStr

* @return

*/

public Claims parseJWT(String jwtStr){

return Jwts.parser()

.setSigningKey(key)

.parseClaimsJws(jwtStr)

.getBody();

}

}

修改需要使用到该工具类的工程的application.yml, 添加配置

image.png

管理员登陆后台签发token

@Bean

public JwtUtil jwtUtil(){

return new util.JwtUtil();

}

下面讲把我登录的例子实例下:

@Autowired

private JwtUtil jwtUtil;

/**

* 用户登陆

* @param loginname

* @param password

* @return

*/

@RequestMapping(value="/login",method=RequestMethod.POST)

public Result login(@RequestBody Map loginMap){

Admin admin =

adminService.findByLoginnameAndPassword(loginMap.get("loginname"),

loginMap.get("password"));

if(admin!=null){

//生成token

String token = jwtUtil.createJWT(admin.getId(),

admin.getLoginname(), "admin");

Map map=new HashMap();

map.put("token",token);

map.put("name",admin.getLoginname());//登陆名

return new Result(true,StatusCode.OK,"登陆成功",map);

}else{

return new Result(false,StatusCode.LOGINERROR,"用户名或密码错

误");

}

}

感谢您阅读我的文章,整理不易,帮我点个赞,谢谢哈。

如果对文章部分还有什么见解或者疑惑,可以私信评论我,欢迎技术讨论。可以加我微信z985085305,获取我整理的一些其他的笔记。

思想的碰撞最能促进技术的进步哦

java中的token机制,基于JWT的Token认证机制java实现(二)相关推荐

  1. 前后端分离中使用基于jwt的token进行身份认证

    基于jwt的Token认证机制可以看之前的文章: 基于JWT的Token认证机制实现 在前后端分离中,我们与前端约定一种身份认证机制.当用户登录的时候,我们会返回给前端一个token,前端会将toke ...

  2. 基于JWT的Token认证机制实现

    一.基于JWT的Token认证机制实现 1.什么是JWT JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 2.JWT组成 ...

  3. jwt重放攻击_【干货分享】基于JWT的Token认证机制及安全问题

    一步一步教你基于JWT的Token认证机制实现,以及如何防范XSS攻击.Replay攻击和中间人攻击. 文章目录 一.几种常用的认证机制 1.1 HTTP Basic Auth HTTP Basic ...

  4. 【java】基于JWT的token身份认证方案

    1.概述 转载:基于JWT的token身份认证方案 2.使用JSON Web Token的好处 2.1 性能问题 验证信息可以由前端保存,后端不需要为保存token消耗内存.JWT方式将用户状态分散到 ...

  5. 基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和session机制)

    几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

  6. ASP.NET WebApi 基于JWT实现Token签名认证

    一.前言 开发提供数据的WebApi服务,最重要的是数据的安全性.那么对于我们来说,如何确保数据的安全将会是需要思考的问题.在ASP.NET WebService服务中可以通过SoapHead验证机制 ...

  7. Web应用中基于密码的身份认证机制(表单认证、HTTP认证: Basic、Digest、Mutual)

    Web应用中基于密码的身份认证机制 背景概念 认证(Authentication) 会话管理 1 表单认证(Form-Based Authentication) 1.1 介绍 1.2 流程 2 通用的 ...

  8. 基于token与基于服务器的身份认证

    基于token与基于服务器的身份认证 1.基于服务器的身份认证 我们清楚 http 协议是无状态的,也就是说,如果我们已经认证了一个用户,那么他下一次请求的时候,服务器不知道我是谁,我们就必须要再次认 ...

  9. java中的复合数据类型是什么_【填空题】类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素。一个类的实现包括两部分:____和_____....

    [填空题]类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素.一个类的实现包括两部分:____和_____. 更多相关问题 [名词解释] 观叶树木 [单选] 开花时有浓郁香气的树种是 ...

最新文章

  1. 典型环节的matlab仿真分析,典型环节的MATLAB仿真.doc
  2. mysql缺少函数_Sqlserver的窗口函数的精彩应用之数据差距与数据岛-答案篇
  3. 基于OSSIM的漏洞***测试视频教程
  4. 机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)
  5. 提示缺少Qedit.h问题
  6. c#位数不够0补充完_C# 位数不足补零
  7. 优秀程序员必备七要件
  8. Java发送Post请求,参数JSON,接收JSON
  9. 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战
  10. android之monkey测试
  11. 为七牛云存储开发的PHP PEAR 包:Services_Qiniu
  12. PowerPoint2003制作抛物线动画的方法
  13. mysql 取汉字笔划数_PHP获取汉字笔画数功能【测试可用】
  14. 基础网络连接及拓扑图
  15. hdoj1299 还是A+B
  16. docker在centos7中run时遇到的坑?
  17. 数据库学习之num1
  18. 根据起始日期、起始时间、终止日期、终止时间计算天数
  19. Q1营收增长66%,Snap继续靠“广告业务”发家能长期利好么?
  20. 计算机算法在生物信息学中的应用,生物信息学在系统发育分析中的应用(自己原创) - 生物科学 - 小木虫 - 学术 科研 互动社区...

热门文章

  1. 百度地图api php开发教程,百度地图API使用方法详解_php实例
  2. python任务栏通知区域_python windows右下角消息提示
  3. 南阳市卧龙区中医院综合楼施工组织设计及投标报价
  4. Python的冒泡问题
  5. 设计冲刺工坊第四期——百格活动
  6. 计算机的广义定义和狭义定义,电子商务应有,广义的定义和狭义的定义之分
  7. 手机号——三大运营商的号段分配
  8. nc升级后java_用友NC系统使用过程中常见问题和解决方法
  9. 联想td350服务器做系统,ThinkServer TD350服务器_ThinkServer TD350 S2609v3 R110i _服务器知识学堂-中关村在线...
  10. GO和JAVA如何处理两个数组中的并集和交集