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. linux下递归删除目录下所有exe文件---从删库到跑路篇

    linux下递归删除目录下所有exe文件 find . -name '*.exe' -type f -print -exec rm -rf {} \; (1) "." 表示从当前目 ...

  2. 洛谷 P4779 【模板】单源最短路径(标准版) 题解

    P4779 [模板]单源最短路径(标准版) 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 然后呢? 100 ...

  3. A. The Fair Nut and Elevator (Codeforces Round #526 (Div. 2))

    A. The Fair Nut and Elevator 好笨啊QAQ. 暴力枚举的题,连分类都不用. 从电梯初始位置到第一层.人到第一层.间隔的层数,往返路程. #include <bits/ ...

  4. Apache2 服务配置 ubuntu16.04 + django1.11

    (步骤) 环境 Ubuntu 16.04 Python 3.5.2 Django 1.11 Apache 2.4 1.Apache2安装 sudo apt-get install apache2 查看 ...

  5. python下浏览器静默运行驱动

    此处以chromdriver为例,放置driver路径问题参看上一篇问题.和java处理差不多,python实现静默运行方式如下 首先解答为什么进行静默运行? 我们在本地一般便于调试可以用GUI界面运 ...

  6. 微众银行Java面试-社招-一面(2019/07)

    个人情况 2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验.做过分布式开发,没有高并发的处理经验,平时做To G的项目居多.写下面经是希望 ...

  7. Lomok @Data使用

    看了廖师兄的Springboot视频发现很多很好玩的小工具,lombok就是其中一个.lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来 ...

  8. 关于java nio的channel读写的一个困惑

    这里提的需求基本都是IM的,IM的解决方案是怎么样的? 网上的需求: 1. 某一用户发了一条信息, 需要服务器反回一个信息(这种最简单) 2. 某一用户发了一条信息,需要服务器广播给所有客户端 3. ...

  9. Java文件上传下载原理

    文件上传下载原理 在TCP/IP中,最早出现的文件上传机制是FTP.它是将文件由客户端发送到服务器的标准机制. 但是在jsp编程中不能使用FTP方法来上传文件,这是由jsp运行机制所决定的 文件上传原 ...

  10. MySql通过数据库文件恢复数据库

    以表”Table”为例: 如类型是MyISAM, 数据文件则以”Table.frm””Table.MYD””Table.MYI””三个文件存储于”/data/$databasename/”目录中. 如 ...