• 使用JWT验证客户的携带的token
  • 客户端在请求接口时,需要在request的head中携带一个token令牌
  • 服务器拿到这个token解析获取用户资源,这里的资源是非重要的用户信息

目前我的理解,用于校验的几种方式

1. 拦截器
2. SpringSecurity验证(目前没有弄懂)
3. shiro拦截验证

拦截器
配置好拦截器后,过滤掉无需验证的接口,其他的接口在请求的时候,获取其token然后解析是否是正确的客户端资源
SrpingSecurity
SpringSecurity就麻烦多了...此处省略1000字
Shiro自定义认证
shiro在自定义realm中有两个方法,一个是认证,一个是授权,在其认证的方法内验证其token

重点

上面说的只是个流程,最主要的是jwt怎么做token的编码和解码的
        long expire = 680090;
        String  = "123";
这里有两个需要注意的地方,就是设置过期时间和盐

过期时间是验证token的有效时间,在自己手动设置过期时间内是有效的,超过此时间,jwt就无法解析其token了
 其次是盐,这是个字符串常量,也可以动态生成盐,放入数据库中在验证的时候获取解析,这里需要将其词符串设置成Base64编码,不然会解析错误..(大坑)这里使用的是apache的codec来编码字符串,也可使用java自带的Base64工具编码

生成token

 /**
* 生成jwt token
*/
public String generateToken(long userId) {
Date nowDate = new Date();
//过期时间
Date expireDate = new Date(nowDate.getTime() + expire * 1000); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
//生成加密密钥
return Jwts.builder()
.setHeaderParam("typ", "JWT")
.setSubjectsecret(userId+"")
.setIssuedAt(nowDate)
.setExpiration(expireDate)
.signWith(signatureAlgorithm, new String(org.apache.commons.codec.binary.Base64.encodeBase64(secret.getBytes())))
.compact();
}

ps: 在这里传入的是用户id,这在解码后通过getSubject()方法可以获取到,如果需要传入用户的多个信息也可以设置成

.claim("info",userInfo)
     .claim("id",userId)
获取

    @Test
public void jwt(){
String s = generateToken(1,"小明");
System.out.println(s);
Claims claimByToken = getClaimByToken(s);
System.out.println(claimByToken.get("info")+"--"+claimByToken.get("id"));
}
resut: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpbmZvIjoi5bCP5piOIiwiaWQiOjEsImlhdCI6MTU0NDg4NTQyOCwiZXhwIjoxNTQ1NTY1NTE4fQ.4SvjebEFd4lixC1jHgyMpQrlPoQz8DI0BTFYsGY0GsPKx_dc7GfDLR2qd_mi46mLpDvJ0HCatfEmhb7w7y9xrA 小明--1

解析token

 /**
* 解析token
*
* @param token
* @return
*/
public Claims getClaimByToken(String token) {
String secret = "123";
try {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
return Jwts.parser()
.setSigningKey(new String(org.apache.commons.codec.binary.Base64.encodeBase64("123".getBytes())))
.parseClaimsJws(token)
.getBody();
}catch (Exception e){
System.out.println("jwt 解密失败");
return null;
}
}

 

ps:目前解决了基本问题,shiro+jwt 就很NICE-__-

至于SpringSecurity:还是要多多学习了.....

踩坑之路---JWT验证的更多相关文章

  1. html2canvas的踩坑之路

    html2canvas的踩坑之路 前言 早有耳闻这个html2canvas比较坑,但无奈于产品需求的压迫,必须实现html转图片的功能,自此走上了填坑之路,好在最后的效果还算令人满意,这才没有误了产品 ...

  2. MySQL Connector/NET 使用小结(踩坑之路)

    背景描述 根据项目的需要,需连接MySQL获取数据. 首先,先了解一下项目的情况: 之前的代码是C#编写的的, 运行时:.NETFramework3.5. 由于项目已经部署上线,因此不能升级运行时,这 ...

  3. Android 上传开源项目到 jcenter 实战踩坑之路

    本文微信公众号「AndroidTraveler」首发. 背景 其实 Android 上传开源项目到 jcenter 并不是一件新鲜事,网上也有很多文章. 包括我本人在将开源项目上传到 jcenter ...

  4. Java踩坑之路

    陆陆续续学Java也快一年多了,从开始的一窍不通到现在的初窥门径,我努力过,迷茫过,痛过,乐过,反思过,沉淀过.趁着新年,我希望能把这些东西记下来,就当是我一路走来的脚印. 一.初识网站应用 记得第一 ...

  5. Android SDK 开发——发布使用踩坑之路

    前言 在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的. 为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的. 背景 刚好最近自己遇到了类似需 ...

  6. jQuery升级踩坑之路

    1.使用了被废弃的jQuery.browser属性 jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更 ...

  7. Mahout踩坑之路

    一.版本对比 公司版Mahout 由于Mahout只能允许于hadoop0.20以上版本上,而百度的hadoop是hadoop0.19的一个分支.因此百度HPC组曾经将Mahout移植到百度的hado ...

  8. webpack踩坑之路——构建基本的React+ES6项目

    转自:http://www.cnblogs.com/ghost-xyx/p/5483464.html webpack是最近比较火的构建工具,搭配上同样比较火的ReacJS与ES6(ES2015)一定是 ...

  9. webpack踩坑之路——图片的路径与打包

    转自:http://www.cnblogs.com/ghost-xyx/p/5812902.html 刚开始用webpack的同学很容易掉进图片打包这个坑里,比如打包出来的图片地址不对或者有的图片并不 ...

随机推荐

  1. 与PON相关的abbreviation

    AAL:Asynchronous transfer mode Adaptation Layer 异步传输适配层 ACS:Autoconfiguration Server 自动配置服务 ADSL:Asy ...

  2. Web开发(调试方法 F12)

    参考: 参考:MDN 调试HTML 参考:什么是浏览器开发者工具? 参考:检查和编辑页面与样式 工具参考:标记验证服务 工具参考:直接输入验证(直接输入HTML源码进行在线检查) 目录: 1.相关快捷 ...

  3. ambari卸载集群

    #1.删除hdp.repo和hdp-util.repo cd /etc/yum.repos.d/ rm -rf hdp* rm -rf HDP* #rm -rf ambari* #2.删除安装包 #用 ...

  4. Python Flask Restful

    Flask  Restful 1.flask restful 在flask基础上进行一些封装,主要用于实现restful接口 2.restful的理解 1)URI(统一资源标识符):每一个URI代表一 ...

  5. HTTPS请求

    hhtps:HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP通道,简单讲是HTTP的安全版,即 ...

  6. 学习懈怠的时候,可以运行Qt自带的Demo,或者Delphi控件自带的Demo,或者Cantu书带的源码,运行一下Boost的例子(搞C++不学习Boost/Poco/Folly绝对是一大损失,有需要使用库要第一时间想到)(在六大的痛苦经历说明,我的理论性确实不强,更适合做实践)

    这样学还不用动脑子,而且熟悉控件也需要时间,而且慢慢就找到感觉了,就可以精神抖擞的恢复斗志干活了.或者Cantu书带的源码. 并且可以使用Mac SSD运行Qt的Demo,这样运行速度快一点. 此外, ...

  7. 反射的应用,jdbc封装

    实现在Java中查询数据库并保存在Java中 1.创建Dept类(要查找的类) package cn.ljs; public class Dept { private int deptno; priv ...

  8. PHPExcel 读取 xls

    <?php $xlsPath = './test.xls'; //指定要读取的exls路径 //$type = 'Excel2007'; //设置要解析的Excel类型 Excel5(2003或 ...

  9. MySQL主从复制延迟的问题 #M1002#

    MySQL主从复制延迟的问题 #M1002# https://mp.weixin.qq.com/s/NwFGER-qn2xQ5TnG-php1Q 更为糟糕的是,MySQL主从复制在大事务下的延迟.同样 ...

  10. c++中的auto、const auto&

    先介绍一下auto.const: 在块作用域.命名作用域.循环初始化语句等等  中声明变量时,关键词auto用作类型指定符. const:修饰符 接下来我们细细分析一下: (1)auto auto即 ...