Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >安全|Java中使用JWT生成Token进行接口鉴权实现

安全|Java中使用JWT生成Token进行接口鉴权实现

作者头像
黄小怪
发布于 2018-12-21 06:31:04
发布于 2018-12-21 06:31:04
3.7K00
代码可运行
举报
文章被收录于专栏:小怪聊职场小怪聊职场
运行总次数:0
代码可运行

先介绍下利用JWT进行鉴权的思路: 1、用户发起登录请求。 2、服务端创建一个加密后的JWT信息,作为Token返回。 3、在后续请求中JWT信息作为请求头,发给服务端。 4、服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过;解密失败说明Token无效或者已过期。

流程图如下:

网图

一、用户发起登录请求

欢迎大家访问www.fota.com

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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信息作为请求头,发给服务端

缺一个图,马上补

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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("<font size=6 color=red>对不起,您的请求非法,系统拒绝响应!</font>");
            return false;
        } else{
            return true;
        }
    }
}

2、拿到之后进行解密校验 Decode and Verify Tokens

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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体验我们的产品。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.12.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基础10:全面解读Java异常
这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”资料“即可领取 3T 免费技术学习资源以及我我原创的程序员校招指南、Java学习指南等资源)
程序员黄小斜
2019/04/07
5160
Java异常处理
try 块后面可以接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
Breeze.
2022/04/15
1.2K0
Java异常处理
[ Java学习基础 ] Java异常处理
一、异常概述   异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。   异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。   这些异常有的是因为用
Kevin_Zhang
2018/05/22
2K0
Java异常处理
异常:在Java语言中,将程序执行中发生的不正常情况称为“异常” 开发过程中的语法错误和逻辑错误不是异常)
Java_慈祥
2024/08/06
1410
Java异常处理
Java异常处理流程
在Java应用中,异常的处理机制分为抛出异常和捕获异常。文章目录1.抛出异常2.捕获异常3.异Java
Java架构师必看
2021/07/15
9300
Java异常处理流程
【Java ——异常机制详解】
异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
奥耶可乐冰
2024/05/31
2940
Java异常详解
异常类Throwable有两个子类:Error(不能处理的错误)和Exception(可处理的异常),我们平常所说的异常指的是Exception;
訾博ZiBo
2025/01/06
1610
Java异常详解
java(3)-深入理解java异常处理机制
try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。不信?那你看看下面的代码,“猜猜”它执行后的结果会是什么?不要往后看答案、也不许执行代码看真正答案哦。如果你的答案是正确,那么这篇文章你就不用浪费时间看啦。
黄规速
2022/04/14
4490
java(3)-深入理解java异常处理机制
Java异常处理机制
我们经常看到运行程序代码,如果出现错误,我们的控制台就是一片红,这是JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行。
JanYork_简昀
2022/03/31
5270
Java异常处理机制
札记:Java异常处理
异常概述 程序在运行中总会面临一些“意外”情况,良好的代码需要对它们进行预防和处理。大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作顺序,输入文件错误
用户1172465
2018/01/08
1.3K0
札记:Java异常处理
java -- 第8章 异常处理
1.编写一个类ExceptionTest,在main方法中使用try-catch-finally语句结构实现:
北山啦
2022/11/27
4250
java -- 第8章 异常处理
Java异常Exception详解
将可能出现异常的代码块选中->快捷键 ctrl + alt + t -> 选中 try-catch
timerring
2023/04/21
5680
Java异常Exception详解
Java常用工具之异常
在程序开发中,异常指不期而至的各种状况。它是一个事件,当发生在 程序运行期间时,会干扰正常的指令流程。
慕白
2020/01/02
6490
Java常用工具之异常
Java异常处理详解
在本篇技术博客中,我们将全面探讨Java中的异常处理机制。无论您是初学者还是有一定经验的开发者,都将从中受益匪浅。我们将深入研究异常的分类、捕获和处理方式,并提供异常处理的最佳实践。通过本文的学习,您将能够编写健壮的Java应用程序,并优雅地处理各种异常情况。
默 语
2024/11/20
1720
java异常体系及1.7中的try-with-resources
异常指java运行过程出现的错误,在java中,将异常当作对象来处理,java.lang.Throwable是所有异常的超类。其架构如下图:
冬天里的懒猫
2020/08/03
7840
Java异常详解
推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与大家分享这个宝藏网站,请点击下方链接查看。 https://www.captainbed.cn/f1
鲜于言悠
2024/06/01
1610
Java异常详解
Java之异常处理
Java异常处理 异常:异常就是Java程序在运行过程中出现的错误。 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象。其实就是Java对不正常情况进行描
二十三年蝉
2018/03/01
8040
Java之异常处理
【Java入门提高篇】Day17 Java异常处理(下)
  今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势。
弗兰克的猫
2018/05/12
9704
【Java入门提高篇】Day17 Java异常处理(下)
Java异常面试题(2020最新版)
Java异常架构与异常关键字Java异常简介Java异常架构1. Throwable2. Error(错误)3. Exception(异常)运行时异常编译时异常
用户7886150
2020/12/18
8130
夯实Java基础系列10:深入理解Java中的异常体系
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/09/28
4370
相关推荐
Java基础10:全面解读Java异常
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验