先介绍下利用JWT进行鉴权的思路:

1、用户发起登录请求。

2、服务端创建一个加密后的JWT信息,作为Token返回。

3、在后续请求中JWT信息作为请求头,发给服务端。

4、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

流程图如下:

网图

一、用户发起登录请求

欢迎大家访问www.fota.com

二、服务端创建一个加密后的JWT信息,作为Token返回

1、用户登录之后把生成的Token返回给前端

@Authorization

@ResponseBody

@GetMapping("user/auth")

public Result getUserSecurityInfo(HttpServletRequest request) {

try {

UserDTO userDTO = ...

UserVO userVO = new UserVO();

//这里调用创建JWT信息的方法

userVO.setToken(TokenUtil.createJWT(String.valueOf(userDTO.getId())));

return Result.success(userVO);

} catch (Exception e) {

return Result.fail(ErrorEnum.SYSTEM_ERROR);

}

}

2、创建JWT,Generate Tokens

import javax.crypto.spec.SecretKeySpec;

import javax.xml.bind.DatatypeConverter;

import java.security.Key;

import io.jsonwebtoken.*;

import java.util.Date;

//Sample method to construct a JWT

private String createJWT(String id, String issuer, String subject, long ttlMillis) {

//The JWT signature algorithm we will be using to sign the token

SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

long nowMillis = System.currentTimeMillis();

Date now = new Date(nowMillis);

//We will sign our JWT with our ApiKey secret

byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(apiKey.getSecret());

Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());

//Let's set the JWT Claims

JwtBuilder builder = Jwts.builder().setId(id)

.setIssuedAt(now)

.setSubject(subject)

.setIssuer(issuer)

.signWith(signatureAlgorithm, signingKey);

//if it has been specified, let's add the expiration

if (ttlMillis >= 0) {

long expMillis = nowMillis + ttlMillis;

Date exp = new Date(expMillis);

builder.setExpiration(exp);

}

//Builds the JWT and serializes it to a compact, URL-safe string

return builder.compact();

}

3、作为Token返回

看后面有个Token

三、在后续请求中JWT信息作为请求头,发给服务端

Authorization的值。

image.png

四、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

1、在拦截器中读取这个Header里面的Token值

@Slf4j

@Component

public class AuthorizationInterceptor extends HandlerInterceptorAdapter {

private boolean chechToken(HttpServletRequest request, HttpServletResponse response) throws IOException{

Long userId = ...;

if (!TokenUtil.parseJWT(request.getHeader("Authorization"), String.valueOf(userId))){

response.setContentType("text/html;charset=GBK");

response.setCharacterEncoding("GBK");

response.setStatus(403);

response.getWriter().print("对不起,您的请求非法,系统拒绝响应!");

return false;

} else{

return true;

}

}

}

2、拿到之后进行解密校验

Decode and Verify Tokens

import javax.xml.bind.DatatypeConverter;

import io.jsonwebtoken.Jwts;

import io.jsonwebtoken.Claims;

//Sample method to validate and read the JWT

private void parseJWT(String jwt) {

//This line will throw an exception if it is not a signed JWS (as expected)

Claims claims = Jwts.parser()

.setSigningKey(DatatypeConverter.parseBase64Binary(apiKey.getSecret()))

.parseClaimsJws(jwt).getBody();

System.out.println("ID: " + claims.getId());

System.out.println("Subject: " + claims.getSubject());

System.out.println("Issuer: " + claims.getIssuer());

System.out.println("Expiration: " + claims.getExpiration());

}

五、总结

大家知道,我之前做过爬虫,实际这种思路在微博做反爬时也用过,看过我之前文章的同学应该知道。

好了,最后欢迎大家访问www.fota.com体验我们的产品。

java 接口鉴权_安全|Java中使用JWT生成Token进行接口鉴权实现相关推荐

  1. java 接口 token_Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...

  2. 接口使用jwt返回token_Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行 ...

  3. tp5 JWT生成token验证接口安全、防止高频请求

    1.composer安装 jwt composer require lcobucci/jwt 3.3 2.在extend/tools/jwt目录下创建Token.php文件 注意 extend目录下t ...

  4. java.lang.IllegalArgumentException: 字符[_]在域名中永远无效。 at

    [http-nio-8080-exec-1] org.apache.coyote.AbstractProcessor.parseHost [xxx_tomcat] 是无效主机注意:更多的请求解析错误将 ...

  5. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  6. 【SpringBoot】44、SpringBoot中整合JWT实现Token验证(整合篇)

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

  7. JAVA中为什么要用接口定义编程_【Java公开课|为什么要用Java接口,这些内容你一定要搞清楚】- 环球网校...

    [摘要]作为一门面向对象编程语言,Java吸收了C++语言的优点,也展现了其强大的一面,我们能在各个地方看到其功能强大和简单易用的两个特征,当然,也吸引了很多程序员的注意力,所以就有人想了解Java的 ...

  8. java类接口的区别_【Java基础】java接口和类的区别-瑶瑶吖的回答

    基本语法区别 Java中接口和抽象类的定义语法分别为interface与abstract关键字. 抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为 ...

  9. java 是否含有日文_《JAVA编程思想》5分钟速成:第9章(接口)

    第9章 接口 前言: 1.抽象类(abstract class)和接口(interface)有什么异同? 2.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(n ...

最新文章

  1. 强势 图解 AC自动机(保证您一次就能学会!)
  2. 100本名著浓缩成了100句话
  3. python程序中断时,输出打印日志
  4. 内置函数(面向对象)
  5. noip2011day1题解
  6. [蓝桥杯][2019年第十届真题]糖果(状压dp)
  7. 跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义
  8. xms跨平台基础框架 - 基于.netcore
  9. PhpYun人才系统 与 Discuz 社区 通过 Ucenter 做会员整合
  10. php调用apache,apache调用php执行系统命令
  11. super-smack
  12. java进账和转账需要锁吗,Spring与Java中的锁
  13. 如何使用Internet Download Manager批量下载音乐素材?
  14. 设计用于环境监测的无线传感网多跳数据采集、传输系统。在PC机上能显示当前测得的温/湿度、光照等环境信息。当光照超过一定阈值时,感知节点通过LED信号灯给以报警。
  15. 【机器学习】数据驱动方法在电网稳定分析应用浅谈
  16. [LiteratureReview]EAO-SLAM Monocular Semi-Dense Object SLAM Based on Ensemble Data Association
  17. 导进去然后这边就报错了 看修改也看不懂
  18. 一键安装Lnmp教程
  19. 京东技术解密读书笔记
  20. go语言学习第一弹:go和php的区别

热门文章

  1. 欧洲杯决赛倒计时,球迷经济带火了哪些产品?
  2. c++ 包络谱分析代码_信号处理——Hilbert变换及谱分析
  3. [ExtJS5学习笔记]第二十八节 sencha ext js 5.1.0发布版本正式发布 extjs doc下载地址
  4. 中值联:首个区块链诚信认证平台成立
  5. 我的 博客 主页
  6. mysql安装5.1.57_数据库mysql57安装
  7. php随机名人名言,php随机输出名人名言的代码
  8. QT学习:字体对话框
  9. 老子云3D产品及服务全介绍,一张图告诉你如何选!
  10. mybatis源码考究二(sqlsession线程安全和缓存失效)