You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring与JJWT环境中JWT末尾添加特殊字符未被拦截的问题咨询

问题解答

这是JJWT的已知行为

JJWT在解析JWT时,默认逻辑是按.分割出header、payload、signature三个核心段。对于signature段之后追加的?@!#这类非Base64URL字符,框架会自动忽略——因为签名验证仅处理signature段中的有效Base64URL字符,截断后续非法内容,所以不会触发错误,导致带末尾特殊字符的token仍能通过认证。

其他解决方案

除了你已经实现的自定义Base64URL字符校验,还有两种更简洁的处理方式:

1. 正则表达式预校验

在解析token前,用正则强制校验完整格式,确保token仅包含合法Base64URL字符(A-Za-z0-9-_)和分隔符.,且严格为三段结构:

private boolean isValidJwtFormat(String token) {
    String jwtPattern = "^[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+\\.[A-Za-z0-9\\-_]+$";
    return token.matches(jwtPattern);
}

在JwtAuthenticationFilter中先执行该校验,格式不合法直接拒绝认证请求。

2. 启用JJWT内置的严格签名校验

JJWT 0.12.x版本支持通过ParserBuilder配置严格解析规则,强制要求signature段仅包含合法Base64URL字符:

JwtParser jwtParser = Jwts.parser()
    .setSigningKey(yourSigningKey) // 替换为你的签名密钥
    .requireStrictSignature() // 启用后会拒绝含非法字符的signature段
    .build();

启用该配置后,解析带末尾特殊字符的token时,框架会直接抛出JwtParseException,终止认证流程。

补充说明

你实现的isBase64URL校验方法是有效的,但正则校验或框架内置的严格规则可以减少自定义代码量,更贴合JJWT的原生处理逻辑。

内容的提问来源于stack exchange,提问作者박대영

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:13:10