本文你能学到什么?token的组成
token串的生成流程。
token在客户端与服务器端的交互流程
Token的优点和思考
参考代码:核心代码使用参考,不是全部代码JWT token的组成头部(Header),格式如下:
{
“typ”: “JWT”,
“alg”: “HS256”
}
由上可知,该token使用HS256加密算法,将头部使用Base64编码可得到如下个格式的字符串:eyJhbGciOiJIUzI1NiJ91有效载荷(Playload):
{  “iss”: “Online JWT Builder”,  “iat”: 1416797419,  “exp”: 1448333419,  ……. “userid”:10001
}
有效载荷中存放了token的签发者(iss)、签发时间(iat)、过期时间(exp)等以及一些我们需要写进token中的信息。有效载荷也使用Base64编码得到如下格式的字符串:eyJ1c2VyaWQiOjB91签名(Signature):
将Header和Playload拼接生成一个字符串str=“eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我们提供的密钥(secret,服务器自己提供的一个字符串)对str进行加密生成最终的JWT,即我们需要的令牌(token),形如:str.”签名字符串”。token在服务与客户端的交互流程1:客户端通过用户名和密码登录
2:服务器验证用户名和密码,若通过,生成token返回给客户端。
3:客户端收到token后以后每次请求的时候都带上这个token,相当于一个令牌,表示我有权限访问了
4:服务器接收(通常在拦截器中实现)到该token,然后验证该token的合法性(为什么能验证下面说)。若该token合法,则通过请求,若token不合法或者过期,返回请求失败。关于Token的思考服务如何判断这个token是否合法?
由上面token的生成可知,token中的签名是由Header和有效载荷通过Base64编码生成再通过加密算法HS256和密钥最终生成签名,这个签名位于JWT的尾部,在服务器端同样对返回过来的JWT的前部分再进行一次签名生成,然后比较这次生成的签名与请求的JWT中的签名是否一致,若一致说明token合法。由于生成签名的密钥是服务器才知道的,所以别人难以伪造。token中能放敏感信息吗?
不能,因为有效载荷是经过Base64编码生成的,并不是加密。所以不能存放敏感信息。Token的优点(1)相比于session,它无需保存在服务器,不占用服务器内存开销。
(2)无状态、可拓展性强:比如有3台机器(A、B、C)组成服务器集群,若session存在机器A上,session只能保存在其中一台服务器,此时你便不能访问机器B、C,因为B、C上没有存放该Session,而使用token就能够验证用户请求合法性,并且我再加几台机器也没事,所以可拓展性好就是这个意思。
(3)由(2)知,这样做可就支持了跨域访问。Java实例:JWT token使用部分代码来自互联网,找不到原作者了。。
编写JWT(Java Web Token)操作类:JavaWebTokenpublic class JavaWebToken {private static Logger log = LoggerFactory.getLogger(JavaWebToken.class);//该方法使用HS256算法和Secret:bankgl生成signKeyprivate static Key getKeyInstance() {//We will sign our JavaWebToken with our ApiKey secretSignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl");Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());return signingKey;}//使用HS256签名算法和生成的signingKey最终的Token,claims中是有效载荷public static String createJavaWebToken(Map<String, Object> claims) {return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact();}//解析Token,同时也能验证Token,当验证失败返回nullpublic static Map<String, Object> parserJavaWebToken(String jwt) {try {Map<String, Object> jwtClaims =Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody();return jwtClaims;} catch (Exception e) {log.error("json web token verify failed");return null;}}
}123456789101112131415161718192021222324252627282930编写登录Conreoller,在服务器端给客户返回token.public LoginStatusMessage checkUserAndPassword(@RequestParam(value="username",required=true) String username,@RequestParam(value="password",required=true) String password,User user,HttpServletRequest request) throws Exception{User u = new User();//登录成功if((u = userService.checkUsernameAndPassword(user)) != null){Map<String,Object> m = new HashMap<String,Object>();m.put("userid", user.getUserid());String token = JavaWebToken.createJavaWebToken(m);System.out.println(token);LoginStatusMessage lsm = new LoginStatusMessage();lsm.setUser(u);lsm.setToken(token);return lsm;};//登录失败,返回Nullreturn null;}123456789101112131415161718在拦截器中对请求中的Token验证(部分代码,表示下意思):String token = request.getParameter("token");if(JavaWebToken.parserJavaWebToken(token) != null){//表示token合法return true;}else{//token不合法或者过期return false;}---------------------本文来自 bug_lover_liao 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/csdn_blog_lcl/article/details/73485463?utm_source=copy 

token的组成和使用相关推荐

  1. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  2. SpringBoot2.3 修改响应头、添加更新token、解决在过滤器中修改失败

    前言 使用Spring Boot开发项目的过程中,难免会遇到向响应头中写入一些信息,例如更新了的token,用户详情等信息.在请求头中添加,请求时就可以通过过滤器,拦截器等验证或者获得请求头传递的信息 ...

  3. [JAVA EE]session 和 token 机制

    HTTP 协议是无状态的. 即服务器对于客户端每次发送的请求都认为它是一个新的请求. 本次请求和上次请求无法判断是不是同一个客户端操作的. 随着 Web 应用的发展,如在线购物网站,需要登录的网站等, ...

  4. php token的生成和使用

    原文连接:http://ukagaka.github.io/php/2018/05/08/JWT.html 1. 为什么要使用tokent进行登录 前后端分离或者为了支持多个web应用,那么原来的co ...

  5. token验证失败_ASP.NET CORE WEBAPI JWT 带BEARER的TOKEN

    JWT主要由三部分构成,header. payload .signature,下面给出详细的TOKEN生成及使用代码. 1.注册JWT服务 public void ConfigureServices( ...

  6. c# redis 如何设置过期时间_Redis Hash存储token、及设置过期时间

    相信大家在很多业务场景都会遇到对数据设置过期时间,如安全认证token.短信验证码等.一般我们的解决有几种:存redis.存数据库.实时计算(如JWT),不管使用哪种方式,需求就是过期了对数据的清理. ...

  7. php jwt token过期时间,php – 动态设置laravel jwt的到期时间

    嗨,我在前端使用角度js,在后端使用带有tymon jwt库的卫星和laravel.我正在使用jwt身份验证.我想在我的网络应用程序中记住我的功能.我看到'ttl'在laravel'config / ...

  8. php access token缓存,微信小程序PHP 生成access_token存入缓存

    每个小程序都会对应后台的一系列接口.access_token一天2000次,每个有效期为2小时.所以可以保存到缓存中,每隔一段时间去获取一次. 把appid和secret放在全局配置文件中,方便调用 ...

  9. php jwt使用案例,PHP使用JWT创建Token的实例详解

    iss (issuer)issuer请求实体,可以是发起请求的用户的信息,也可是jwt的签发者 sub (Subject)设置主题,类似于发邮件时的主题 aud (audience)接收jwt的一方 ...

  10. GitHub上传代码、更新代码、token设置

    准备工作: 创建GitHub账号. 在本机电脑安装git工具. git配置用户名和邮箱 打开git Bash,依此输入如下命令: git config --global user.name " ...

最新文章

  1. linux el5 el6 区别,Oracle ACFS Support on Linux詳解
  2. 绘制业务流程图:流程图绘制工具
  3. Leetcode 392. 判断子序列 (每日一题 20210929)
  4. MariaDB Galera Cluster with HA Proxy and Keepalived on Cents 6
  5. Cant get connection to Zookeeper
  6. mysql workbench 1064_MySQL Workbench:查询错误(1064):第1行“ VISIBLE”附近的语?mysql-问答-阿里云开发者社区-阿里云...
  7. yml读取环境变量_读取yml配置文件中的值
  8. 【★】EIGRP终极解析!
  9. 为什么matlab用不成了,matlab2008 安装了不能用为什么?
  10. CCProgressTimer进度条效果
  11. 正则表达式,以python为例
  12. 【NCD 2019 B】Let me sleep【边双连通分量缩点、树的直径】
  13. 一个字段,就可以判断是否关注公众号,你信吗
  14. 深大uooc学术道德与学术规范教育第一章
  15. 中石油大学22春季《大学英语(四)#》第一阶段在线作业
  16. calcite查询mysql_Apache Calcite教程-SQL解析-Calcite SQL解析
  17. 校园网及入网计算机管理制度,校园网用户入网管理规定
  18. js距离米转换为千米_公里和千米的换算(千米和米换算公式)
  19. 三网融合触发MeeGo风暴
  20. Android底部菜单栏、Android沉浸式状态栏(顶部状态栏修改颜色)、自定义标题栏

热门文章

  1. 利用ES文件浏览器访问电脑上的文件
  2. 吴恩达机器学习_What is Machine Learning?
  3. python爬虫爬取糗事百科
  4. 力科示波器截屏功能 python代码实现
  5. 招商加盟行业如何精准获客:招商加盟客户资源如何获取,加盟商客源怎么找
  6. 特征值分解和SVD分解
  7. 在OpenCV里实现条码识别
  8. 某社区团购公司宣布破产。。。
  9. 化妆品英国SCPN注册(英国SCPN认证)
  10. qrcode生成二维码-项目记录