JWT简介

jwt非常适合前后分离 和 分布式的应用

不必在服务端存储session,本地也不用存储cookie

直接存两段信息即可

      localStorage["jwt"] = jwt; // token
localStorage["name"] = json.name; // token中加密的某个字段,用于后期请求带上校验token是否被改

可以把认证相关的信息都存储在里面,添加拦截去进行校验即可

JWT认证流程:

  1. 用户登录成功,生成token,返回一个对象(包含token,用户名)
  2. 每次请求都带上这个对象(通过js存储在电脑)
  3. jwt过滤器会校验token解密之后的name是否和用户名相同,相同则放行
  4. 完成(后续可能需要加上token刷新的动作)

详细介绍:JWT 丨 JSON Web Tokens 丨 java-jwt | 详细介绍以及用法


完整的认证demo

点击查看 - 托管在github - 有说明

https://github.com/hisenyuan/SSM_BookSystem/tree/master/BookSystem_V3

maven依赖

<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>

JWT生成与解密

package com.hisen.jars.jwt;

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.joda.time.DateTime; /**
* 利用java-jwt 3.2.0版本
* 每个版本的方法不大一样
* Created by hisenyuan on 2017/8/17 at 15:41.
*/
public class Jwt {
private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK sdfkjsdrow32234545df>?N<:{LWPW_hisen";
private static final String EXP = "exp";
private static final String PAYLOAD = "payload"; /**
* 生成Token:jwt
* @param object 传入的加密对象 - 放入PAYLOAD
* @param maxAge 过期事件,单位毫秒
* @param <T>
* @return
*/
public static <T> String sign(T object, long maxAge) {
Map<String, Object> map = new HashMap<String, Object>();
String jsonString = JSON.toJSONString(object);
map.put("alg", "HS256");
map.put("typ", "JWT");
long exp = System.currentTimeMillis() + maxAge;
System.out.println("JWTUtil 当前时间:"+new DateTime().toString("yyyy-MM-dd HH:mm:ss EE"));
System.out.println("JWTUtil 过期时间:"+new DateTime(exp).toString("yyyy-MM-dd HH:mm:ss EE"));
String token = null;
try {
token = JWT.create()
.withHeader(map)//header
.withClaim(PAYLOAD, jsonString)//存放的内容 json
.withClaim(EXP, new DateTime(exp).toDate())//超时时间
.sign(Algorithm.HMAC256(SECRET));//密钥
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return token;
} /**
* 解密token
* @param token jwt类型的token
* @param classT 加密时的类型
* @param <T>
* @return 返回解密后的对象 - 如果token过期返回空对象
*/
public static <T> T unsign(String token, Class<T> classT) {
DecodedJWT decode = JWT.decode(token);
Map<String, Claim> claims = decode.getClaims();
if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)){
long tokenTime = claims.get(EXP).asDate().getTime();
long nowTime = new Date().getTime();
// 判断令牌是否超时
if (tokenTime > nowTime){
String json = claims.get(PAYLOAD).asString();
return JSON.parseObject(json, classT);
}
}
return null;
}
}

解密的另外一种写法

这种写法如果令牌超时,直接运行时异常,无法做相关处理

  /**
* 解密token
* @param token jwt类型的token
* @param classT 加密时的类型
* @param <T>
* @return 返回解密后的对象 - 如果token过期返回空对象
*/
public static <T> T unsign(String token, Class<T> classT) {
JWTVerifier verifier = null;
try {
verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
DecodedJWT jwt = verifier.verify(token); // 如果超时,直接抛出运行时异常
Map<String, Claim> claims = jwt.getClaims();
if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {
long tokenTime = claims.get(EXP).asDate().getTime();
long now = new Date().getTime();
// 判断令牌是否已经超时
if (tokenTime > now) {
String json = claims.get(PAYLOAD).asString();
// 把json转回对象,返回
return JSON.parseObject(json, classT);
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (TokenExpiredException e){
e.printStackTrace();
}
return null;
}

JSON WEB TOKEN - 告别session和cookie - java demo的更多相关文章

  1. webapp用户身份认证方案 JSON WEB TOKEN 实现

    webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...

  2. Java JWT: JSON Web Token

    Java JWT: JSON Web Token for Java and Android JJWT aims to be the easiest to use and understand libr ...

  3. JWT(JSON Web Token) 多网站的单点登录,放弃session

    多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...

  4. web登录的session、cookie和token

    为什么会有登录这回事 首先这是因为HTTP是无状态的协议,所谓无状态就是在两次请求之间服务器并不会保存任何的数据,相当于你和一个人说一句话之后他就把你忘掉了.所以,登录就是用某种方法让服务器在多次请求 ...

  5. JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html

    多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...

  6. android 中使用jwt token(json web token)--java

    http://blog.csdn.net/mingzhnglei/article/details/51119836 下面贴上自己项目中的一个小小的example import com.nimbusds ...

  7. 使用json web token

    由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...

  8. Json Web Token(JWT)

    Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(Si ...

  9. JWT(Json web token)认证详解

    JWT(Json web token)认证详解 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该to ...

随机推荐

  1. ubuntu14.04_CUDA8.0_cudnn5.1_Tensorflow配置

    深度学习框架tensorflow相比与caffe抽象层做的更好,即使用tensorflow的人不需要关心底层的实现,做底层实现的人不需要关心上层的模型和算法;caffe耦合比较紧凑,若想caffe用的 ...

  2. 使用Publish Over SSH插件实现远程自动部署

    背景: 现场的部署环境开放外网环境困难,只有一台机器能够开发外网,应对该情况,所有的补丁文件需要直接在master机器上面生成,然后命令移动到其他的服务器上面去. 这里使用到了jenkins的Publ ...

  3. 学习笔记TF032:实现Google Inception Net

    Google Inception Net,ILSVRC 2014比赛第一名.控制计算量.参数量,分类性能非常好.V1,top-5错误率6.67%,22层,15亿次浮点运算,500万参数(AlexNet ...

  4. Spring源码情操陶冶-AbstractApplicationContext

    前言-阅读源码有利于陶冶情操,本文承接前文Spring源码情操陶冶-ContextLoader 约束:本文指定contextClass为默认的XmlWebApplicationContext Abst ...

  5. JVM学习笔记二:垃圾收集算法

    垃圾回收要解决的问题: 哪些内存需要回收? 线程私有区域不需要回收,如PC.Stack.Native Stack:Java 堆和方法区需要 什么时候回收? 以后的文章解答 如何回收? 首先进行对象存活 ...

  6. MongoDB入门命令

    查看所有数据库 > show dbs admin (empty) local 0.078GB > admin和管理相关, admin和local数据库不要轻易动 选择库 > use ...

  7. 微信客户端+微信公众平台+新浪云SAE+Arduino+WS100(控制LED)

    第一步:准备 1.智能手机微信客户端或微信电脑版 2.注册微信公众平台 https://mp.weixin.qq.com 3.注册新浪账号 http://www.sinacloud.com 4.拥有一 ...

  8. 2.跑nodejs文件

    1.安装nodejs的环境,这里不介绍了. app.js 'use strict'; //process.argv 接受变量 var command = process.argv[2]; var a ...

  9. 【.net 深呼吸】导出 Office 文档中的图片

    我们常用的 Office 文档其实就三种——Word.Excel.PowerPoint,分别对应的扩展名为:.docx..pptx..xlsx. 许多教程都告诉我们,要提取这些文件中的图片(其实像视频 ...

  10. swift3.0 移除当前页面的前一个页面

    用的是以下的跳转方式 self.navigationController?.pushViewController(viewController, animated: true) 在当前页面移除方式 s ...