JSON WEB TOKEN - 告别session和cookie - java demo
JWT简介
jwt非常适合前后分离 和 分布式的应用
不必在服务端存储session,本地也不用存储cookie
直接存两段信息即可
localStorage["jwt"] = jwt; // token
localStorage["name"] = json.name; // token中加密的某个字段,用于后期请求带上校验token是否被改
可以把认证相关的信息都存储在里面,添加拦截去进行校验即可
JWT认证流程:
- 用户登录成功,生成token,返回一个对象(包含token,用户名)
- 每次请求都带上这个对象(通过js存储在电脑)
- jwt过滤器会校验token解密之后的name是否和用户名相同,相同则放行
- 完成(后续可能需要加上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的更多相关文章
- webapp用户身份认证方案 JSON WEB TOKEN 实现
webapp用户身份认证方案 JSON WEB TOKEN 实现Deme示例,Java版 本项目依赖于下面jar包: nimbus-jose-jwt-4.13.1.jar (一款开源的成熟的JSON ...
- 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 ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- web登录的session、cookie和token
为什么会有登录这回事 首先这是因为HTTP是无状态的协议,所谓无状态就是在两次请求之间服务器并不会保存任何的数据,相当于你和一个人说一句话之后他就把你忘掉了.所以,登录就是用某种方法让服务器在多次请求 ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- android 中使用jwt token(json web token)--java
http://blog.csdn.net/mingzhnglei/article/details/51119836 下面贴上自己项目中的一个小小的example import com.nimbusds ...
- 使用json web token
由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPHP,到现在的nodejs,我自己的看法是 ...
- Json Web Token(JWT)
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(Si ...
- JWT(Json web token)认证详解
JWT(Json web token)认证详解 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该to ...
随机推荐
- 使用css3实现小菊花加载效果
使用css3实现小菊花加载效果 最常见的就是我们用到的加载动画.加载动画的效果处理的好,会给页面带来画龙点睛的作用,而使用户愿意去等待.而页面中最常用的做法是把动画做成gif格式,当做背景图或是img ...
- 猜年龄---while循环
#!/usr/bin/env python# -*- coding:utf-8 -*-# Author:Andy Chen age_of_oldboy = 56 count = 0while True ...
- js获取客户端MAC地址
最近遇到一个需求,医院要求呼叫中心账号必须对应MAC地址,也就是说该MAC地址必须和呼叫中心账号对应才可使用,这可就难道我了,这需求就要求每次都判断用户登录的电脑MAC地址是否有呼叫中心账号,当然只针 ...
- kali ssh服务连接问题,无法远程管理
1.修改sshd_config文件,命令为:vi /etc/ssh/sshd_config 2.将#PasswordAuthentication no的注释去掉,并且将NO修改为YES 3.将#Per ...
- java多线程系列(三)---等待通知机制
等待通知机制 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理解 ...
- 使用Publish Over SSH插件实现远程自动部署
背景: 现场的部署环境开放外网环境困难,只有一台机器能够开发外网,应对该情况,所有的补丁文件需要直接在master机器上面生成,然后命令移动到其他的服务器上面去. 这里使用到了jenkins的Publ ...
- Pivot Table系列之展开/折叠用法 (Expand/Collapse)
1.遇到的问题: PivotTable中本来已经展开的维度的Hierarchy(层次结构),在切换切片器的数据集时,层次结构就折叠在一起了:没有按照之前的方式展开显示. 2.在做成PivotTable ...
- 【PHP】数据类型转换
PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: (int).(integer):转换成整形 (float).(double).(real):转换成浮点型 (string):转换成字符串 ...
- 【css】圆角 +文本阴影
1. css3 圆角 http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-border-radius.html 2. text shawdow ...
- 网站相关人员信息记录humans.txt
前面的话 robots.txt文件告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取.而humans.txt文件则是为人类准备的,包含参加该网页设计和建立的相关人员的信息.本文将详细介绍humans.tx ...