Jwt客户端存储状态可行性分析

1、前端首次访问后台,后台生成token,放在http header的Authorization里(官网推荐,可解决跨域cookie跨域问题),并且Authorization Type类型为Bearer,将token返回给前端。

2、后台生成token的过程,包括给token指定加密协议比如HS56,加密类型比如“JWT”,自定义数据比如uuid,还有最重要的是记得指定一个超级复杂的密钥,并且定期更换它,密钥用于jwt签名部分。还需要给jwt token指定一个合理的过期时间,这个也同样非常重要。

3、前端获取token后存储token,建议存入本地cookie。

4、前端再次发起后台API接口访问,此时需要带上token,也是放在http header中且Authorization Type类型为Bearer,后台需校验token的正确性后才可访问权限受限的API接口或其他资源。

先添加maven依赖

<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>

JAVA代码案例

 package com.joyce.demo.jwt.controller;

 import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException; /**
* jwt 官网: https://jwt.io
*
* @author Joyce 朱文 2019/6/16
*
*/
@RestController
public class JwtController { private static final String SECRET = "123456"; // jwt token私钥,防止token被盗被破解
public static final long EXPIRATION_TIME = 1800_000L; // token的过期时间,30 分钟 /**
* <pre>
* 步骤1:第一次访问系统,生成token。
* </pre>
*/
@RequestMapping("/joyce/step1/firstAccess")
public String step1(HttpServletRequest request, HttpServletResponse response) { // 把原来放在session里的信息都放入token
HashMap<String, Object> tokenDataMap = new HashMap<>();
tokenDataMap.put("uuid", "避免把敏感信息写入token");
tokenDataMap.put("other", "xxx");
request.getCookies(); // 指定token的过期时间:30分钟
Date thisTokenExpTime = new Date(new Date().getTime() + EXPIRATION_TIME); // 生成jwt token
String token = Jwts.builder().setClaims(tokenDataMap).setExpiration(thisTokenExpTime)
.signWith(SignatureAlgorithm.HS512, SECRET).compact(); // 按照jwt官方说明,可把token放入header中的Authorization,并且Authorization type为“Bearer Token”
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
response.setHeader("Access-Control-Allow-Headers", "Origin,Content-Type,Authorization");
response.setHeader("Authorization", "Bearer " + token);
// response.setHeader("Access-Control-Allow-Origin","*");//启用跨域
// response.setHeader("Access-Control-Allow-Credentials", "true");
// response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,PATCH,PUT");
// response.setHeader("Access-Control-Max-Age", "3600");
// response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,x-requested-with,X-Custom-Header," +
// "Content-Type,Accept,Authorization"); return token;
} /**
* <pre>
* 步骤2:进入后续任何一个页面
* 1、从Authorization header中获取token
* 2、校验token正确性,如果错误,返回提示信息
* </pre>
*/
@RequestMapping("/joyce/step2/validToken")
public String step2(HttpServletRequest request, HttpServletResponse response) { // 获取header
String authorization = request.getHeader("Authorization");
System.out.println("authorization===== " + authorization); // 解析token
String token = StringUtils.EMPTY;
// 如果token为空,则返回失败
if (StringUtils.isBlank(authorization)) {
return "error";
} try {
token = authorization.replaceFirst("Bearer ", StringUtils.EMPTY);
// 得到自定义数据
Map<String, Object> tokenDataMap = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody(); //////////////////////////////////// 取值方式一
// 获取token里payload有效负载数据
String uuid = (String) (tokenDataMap.get("uuid"));
String other = (String) (tokenDataMap.get("other"));
// Date generateTime = new Date((Long) tokenDataMap.get("myDate")); //////////////////////////////////// 取值方式二
Iterator<Entry<String, Object>> it = tokenDataMap.entrySet().iterator();
while (it.hasNext()) {
Entry<String, Object> entry = it.next();
System.out.println("entry = " + entry.getKey() + ":" + entry.getValue());
} // 对所有的异常都需要进行业务处理
} catch (UnsupportedJwtException e) { // 当接收到的JWT格式/配置与应用程序期望的格式不匹配时抛出异常。例如,当应用程序需要一个加密签名的JWS声明时,如果解析一个无签名的明文JWT,则会引发此异常。
// TODO: handle exception
} catch (MalformedJwtException e) { // 非正确的jwt结构
// TODO: handle exception
} catch (SignatureException e) { // 签名错误
// TODO: handle exception
} catch (ExpiredJwtException e) { // token过期
// TODO: handle exception
} catch (IllegalArgumentException e) { // 传递非法参数
// TODO: handle exception
}
return "ok";
} }

end.

jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例的更多相关文章

  1. Blazor client-side + webapi (.net core 3.1) 添加jwt验证流程(非host)第三章 客户端存储及验证

    准备工作: 安装Nuget包:Blazored.LocalStorge. 这是一个client-side 浏览器存储库,找了非常久. 官方文档中也有一款Microsoft.AspNetCore.Pro ...

  2. 三种执行SQL语句的的JAVA代码

    问题描述: 连接数据库,执行SQL语句是必不可少的,下面给出了三种执行不通SQL语句的方法. 1.简单的Statement执行SQL语句.有SQL注入,一般不使用. public static voi ...

  3. Java并发编程(三):并发模拟(工具和Java代码介绍)

    并发模拟工具介绍 ① Postman : Http请求模拟工具 从图上我们可以看出,Postman模拟并发其实是分两步进行操作的.第一步:左边的窗口,在窗口中设置相关接口以及参数,点击运行进行第二步. ...

  4. jwt 0.9.0(一)推荐jwt理由

    本人一直有良好的写技术博文的习惯,最近研究 jwt 有点点心得,赶紧记下来. 我推荐使用jwt(Json Web Token)这种客户端存储状态方式,代替传统的服务端存储状态方式(比如redis存储s ...

  5. Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...

  6. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证【必看】

    前言 关于JWT一共三篇 姊妹篇,内容分别从简单到复杂,一定要多看多想: 一.Swagger的使用 3.3 JWT权限验证[修改] 二.解决JWT权限验证过期问题 三.JWT完美实现权限与接口的动态分 ...

  7. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之五 || Swagger的使用 3.3 JWT权限验证【必看】

    本文梯子 本文3.0版本文章 前言 1.如何给接口实现权限验证? 零.生成 Token 令牌 一.JWT ——自定义中间件 0.Swagger中开启JWT服务 1:API接口授权策略 2.自定义认证之 ...

  8. OAuth2.0实战!使用JWT令牌认证!

    大家好,我是不才陈某~ 这是<Spring Security 进阶>的第3篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...

  9. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...

随机推荐

  1. Cocos Creator开发hello World

    若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理. 请点赞!因为你们的赞同/鼓励是我写作的最大动力! 欢迎关注达叔小生的简书! 这是一个有质量 ...

  2. 记一次CDH集群日志数据清理

    背景 集群运行一段时间(大概一月多)后,cloudera manager管理界面出现爆红,爆红的组件有hdfs.zookeeper. 发现问题 点击详细内容查看,报日志空间不够的错误.初步判断是各个组 ...

  3. 第09组 团队Git现场编程实战

    组长博客链接 1.团队分工 团队成员 分工明细 王耀鑫 博客撰写,数据处理 陈志荣 前端界面,前端功能实现 陈超颖 前端界面,前端功能实现 沈梓耀 前端界面,前端功能实现 林明镇 数据处理 滕佳 前端 ...

  4. QML学习(四)——<Text显示>

    文本显示是界面开发必不可少的内容,在Qt Quick模块中提供了 Text 项目来进行文本的显示,其中可以使用 font 属性组对文本字体进行设置.这一篇我们来看看它们的具体使用. 使用字体 就像前面 ...

  5. 【大数据作业十一】分布式并行计算MapReduce

    作业要求:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapReduce的功 ...

  6. 剑指offer:删除链表中重复的结点

    题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理 ...

  7. python list 和 tuple详解

    list------------------------------------------------------------------------ Python内置的一种数据类型是列表:list ...

  8. SnowFlake分布式ID生成及反解析

    概述 分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种,SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 1位,不用.二进制中最高位为 ...

  9. 30段极简Python代码

    Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性.如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发.作者简单概览了 30 段代码,它们都是 ...

  10. (转载)PyTorch代码规范最佳实践和样式指南

    A PyTorch Tools, best practices & Styleguide 中文版:PyTorch代码规范最佳实践和样式指南 This is not an official st ...