- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用lib JJWT 0.9.0来生成Token。我已经编写了日志代码段生成 token ,并且我看到函数compact()运行非常慢(664 -151 = 513(ms))。如何使函数compact()运行得更快或如何更快地生成 token ?我用的是JDK7。
我的代码:
public String createJWT(String id, String issuer, String subject, List<T> authories, String loginUserData,
long ttlMillis) {
//The JWT signature algorithm we will be using to sign the token
long startTime = System.currentTimeMillis();
LOGGER.info("createJWT id=" + id + ";issuer=" + ";subject=" + subject);
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
//We will sign our JWT with our ApiKey secret
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(ApiSecretKey.getSecretKey());
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);
if (!CheckObjectUtils.isNullOrEmpty(authories)) {
builder.claim(AUTHORITIES_KEY, authories);
}
if (!CheckObjectUtils.isNullOrEmpty(loginUserData)) {
builder.claim(LOGIN_USER_DATA_KEY, loginUserData);
}
builder.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);
}
LOGGER.info("createJWT process id=" + id + ";issuer=" + ";subject=" + subject + ";time(ms)="
+ (System.currentTimeMillis() - startTime));
//Builds the JWT and serializes it to a compact, URL-safe string
String token = builder.compact();
LOGGER.info("createJWT end id=" + id + ";issuer=" + ";subject=" + subject + ";time(ms)="
+ (System.currentTimeMillis() - startTime));
return token;
}
JsonWebTokenRestApi<Long> jwtApi = new JsonWebTokenRestApiFactory(
JsonWebTokenRestApiFactory.JWT_JJWT).getJsonWebTokenByType();
String jwt = jwtApi.createJWT(null, null, "vinhhc_vsc", null, null, 18000);
我的控制台日志:
createJWT id=null;issuer=;subject=vinhhc_vsc
createJWT process id=null;issuer=;subject=vinhhc_vsc;time(ms)=151
createJWT end id=null;issuer=;subject=vinhhc_vsc;time(ms)=664
谢谢!
最佳答案
这是正常的 JVM JIT 行为 - 由于 JIT 优化,初始运行缓慢,随后优化/快速的后续运行是完全正常的。仅在循环中运行 compact()
调用,看看会发生什么。
这是使用最“昂贵”的 key 算法 HMAC-SHA-512 重新编写的测试作为证明:
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.lang.Collections;
import io.jsonwebtoken.lang.Strings;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
import java.util.List;
import java.util.UUID;
public class Test {
private static final Key signingKey = Keys.secretKeyFor(SignatureAlgorithm.HS512);
private static <T> String createJWT(String id, String issuer, String subject, List<T> authories, String loginUserData,
long ttlMillis) {
//The JWT signature algorithm we will be using to sign the token
long startTime = System.currentTimeMillis();
System.out.println("createJWT id=" + id + ";issuer=" + ";subject=" + subject);
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
//Let's set the JWT Claims
JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject)
.setIssuer(issuer);
if (!Collections.isEmpty(authories)) {
builder.claim("authorities", authories);
}
if (!Strings.hasText(loginUserData)) {
builder.claim("loginUserData", loginUserData);
}
builder.signWith(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);
}
System.out.println("createJWT process id=" + id + ";issuer=" + ";subject=" + subject + ";time(ms)="
+ (System.currentTimeMillis() - startTime));
//Builds the JWT and serializes it to a compact, URL-safe string
String token = builder.compact();
System.out.println("createJWT end id=" + id + ";issuer=" + ";subject=" + subject + ";time(ms)="
+ (System.currentTimeMillis() - startTime));
return token;
}
public static void main(String[] args) {
for( int i = 0; i < 10; i++) {
createJWT(UUID.randomUUID().toString(), "issuer", "subject", null, "random user data", 1000);
}
}
}
这是循环的输出:
createJWT id=983edbec-49f9-4754-9836-bae85c6c26e8;issuer=;subject=subject
createJWT process id=983edbec-49f9-4754-9836-bae85c6c26e8;issuer=;subject=subject;time(ms)=19
createJWT end id=983edbec-49f9-4754-9836-bae85c6c26e8;issuer=;subject=subject;time(ms)=319
createJWT id=ee8fa433-d032-4258-80e8-21f5fa54904c;issuer=;subject=subject
createJWT process id=ee8fa433-d032-4258-80e8-21f5fa54904c;issuer=;subject=subject;time(ms)=0
createJWT end id=ee8fa433-d032-4258-80e8-21f5fa54904c;issuer=;subject=subject;time(ms)=1
createJWT id=b8343d70-39e5-41fd-99e0-0046a0dcdb3c;issuer=;subject=subject
createJWT process id=b8343d70-39e5-41fd-99e0-0046a0dcdb3c;issuer=;subject=subject;time(ms)=0
createJWT end id=b8343d70-39e5-41fd-99e0-0046a0dcdb3c;issuer=;subject=subject;time(ms)=0
createJWT id=a2a81bfc-1bfd-42f8-81e3-dd27ca0bc343;issuer=;subject=subject
createJWT process id=a2a81bfc-1bfd-42f8-81e3-dd27ca0bc343;issuer=;subject=subject;time(ms)=0
createJWT end id=a2a81bfc-1bfd-42f8-81e3-dd27ca0bc343;issuer=;subject=subject;time(ms)=0
createJWT id=4236c531-d370-45d6-98cb-532b863d45af;issuer=;subject=subject
createJWT process id=4236c531-d370-45d6-98cb-532b863d45af;issuer=;subject=subject;time(ms)=0
createJWT end id=4236c531-d370-45d6-98cb-532b863d45af;issuer=;subject=subject;time(ms)=1
createJWT id=c3979b5c-2840-48bd-b72d-1e5d3776916b;issuer=;subject=subject
createJWT process id=c3979b5c-2840-48bd-b72d-1e5d3776916b;issuer=;subject=subject;time(ms)=0
createJWT end id=c3979b5c-2840-48bd-b72d-1e5d3776916b;issuer=;subject=subject;time(ms)=0
createJWT id=155e6ac6-da45-402b-a7a8-e98b358a3525;issuer=;subject=subject
createJWT process id=155e6ac6-da45-402b-a7a8-e98b358a3525;issuer=;subject=subject;time(ms)=0
createJWT end id=155e6ac6-da45-402b-a7a8-e98b358a3525;issuer=;subject=subject;time(ms)=1
createJWT id=f1cdc87c-2054-4ff5-bb5c-4b47384a1285;issuer=;subject=subject
createJWT process id=f1cdc87c-2054-4ff5-bb5c-4b47384a1285;issuer=;subject=subject;time(ms)=0
createJWT end id=f1cdc87c-2054-4ff5-bb5c-4b47384a1285;issuer=;subject=subject;time(ms)=0
createJWT id=0303f53f-9b9a-4e7c-99c6-788dbb883ce2;issuer=;subject=subject
createJWT process id=0303f53f-9b9a-4e7c-99c6-788dbb883ce2;issuer=;subject=subject;time(ms)=0
createJWT end id=0303f53f-9b9a-4e7c-99c6-788dbb883ce2;issuer=;subject=subject;time(ms)=1
createJWT id=701d08c1-cfcf-4f20-9270-5b1800d9a7e0;issuer=;subject=subject
createJWT process id=701d08c1-cfcf-4f20-9270-5b1800d9a7e0;issuer=;subject=subject;time(ms)=0
createJWT end id=701d08c1-cfcf-4f20-9270-5b1800d9a7e0;issuer=;subject=subject;time(ms)=0
请注意,第一次(而且只有第一次)运行的成本很高(公平地说,它只有 319 毫秒),而由于 JIT 优化,所有其他运行都非常快。
大多数后续 compact()
调用通常只是微秒(甚至小于 1 毫秒)!
关于java - [JWT][JJWT] 函数compact() 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52218524/
我继承了一个在 POM.xml 中有这个的 java 项目: 0.11.1 // from https://github.com/jwtk/jjwt#maven io.jsonw
好的,我在生成 JWT 时向有效负载添加了几个自定义声明,并且我可以在我的前端 (javascript) 中很好地提取它们。然后,我让我的 javascript 向微服务发送一个 ajax 调用,并将
问题是我的应用程序在 token 过期时抛出异常,而我无法捕获该异常。我想捕获那个异常并做另一件事。尝试在 catch block 上注释异常语句但没有任何进展。 异常(exception): **
使用jjwt库, String compactJws = Jwts.builder().setSubject("Joe").signWith(SignatureAlgorithm.HS512, ke
我是 JWT 新手,想知道当用户退出应用程序时是否可以在服务器端使 JWT 无效/作废(我也想知道这样做是否有意义!) 。想法是: 用户点击应用中的退出链接 应用程序调用 POST https://a
我使用lib JJWT 0.9.0来生成Token。我已经编写了日志代码段生成 token ,并且我看到函数compact()运行非常慢(664 -151 = 513(ms))。如何使函数compac
我正在使用 JJWT 库生成我的 JWT token 。我按如下方式生成我的 token 。我使用虚拟值作为我的 key 。 我们可以假设 jwt.security.key=security-key
对于我正在从事的项目,我需要使用库提供的 Spring Security 和 JSON Webtokens io.jsonwebtoken (jjwt) .我需要添加到生成的 token 中的声明之一
我已成功设置 JJWT 以在一系列 Web 服务的身份验证过程中使用。问题在于它们是在一个 Web 服务中创建的,但跨多个服务进行身份验证。如何成功、安全地使用签名,同时确保我的所有 Web 服务使用
我在使用 JJWT 库创建 JWT 时遇到问题:https://github.com/jwtk/jjwt 我按照说明进行操作并想出了这个简单的类: import io.jsonwebtoken.Cla
我一定错过了什么。我正在使用 JJWT 库来创建 JWT。根据声明中的数据集,从库中创建的 JWT 不一致。我的代码: Date now = new Date(); Date expiration =
我有一个由某些服务生成的 JWT token ,然后在我的 Java 应用程序上进行验证。 问题在于,由于 Base64 解码错误,JJWT 库无法解析 JSON header 。 header Ba
我有一个小问题。我一直在尝试使用不同的库来生成 json token ,现在我正在使用 Stormpath 中的 JJWT。他们有很好解释的教程。但我的问题是,当我尝试在“public static
我尝试创建 JWT token final String jws = Jwts.builder() .claim("rainId", rainId.toString())
Auth0提供两个 JWT 库,一个用于 Node:node-jsonwebtoken ,还有一个用于 Java:java-jwt .它turns out那java-jwt不支持公钥/私钥对。 但是,
我的网站将 JWT(内置 php)发送到我用 Java 开发的应用程序。 JWT 在名为 DATI 的自定义字段中包含一个 JSON 字符串。我使用 JJWT 库来解密 DATI 字段中包含的字符串:
我有以下测试 key ,我正在使用 JJWT 对其执行 JWT 验证: -----BEGIN RSA PRIVATE KEY----- MIIJKAIBAAKCAgEAyzAnJJCV/ihJGhut
我正在验证来自 Azure 的 JWT token 并使用 JJWT。我从与我的 tid 相关的键文档中检索模数和指数,它们是字段分别为n和e。验证失败并出现错误:JWT 签名与本地计算的签名不匹配。
我正在验证来自 Azure 的 JWT token 并使用 JJWT。我从与我的 tid 相关的键文档中检索模数和指数,它们是字段分别为n和e。验证失败并出现错误:JWT 签名与本地计算的签名不匹配。
我在 servlet 上使用 jjwt Java 库在服务器端生成 jwt,下面的代码片段直接来自 jjwt GitHub 页面 https://github.com/jwtk/jjwt生成并打印出这
我是一名优秀的程序员,十分优秀!