JWT验证

博客介绍了在工具包中新建JwtUtils,创建Interceptor包和Interceptor,CustomAnnotation包及PassToken注解用于跳过拦截。还进行了跳过拦截和不跳过拦截的测试,在aaa的header里加入token后成功获取。

在这里插入图片描述
在工具包中新建JwtUtils

public class JwtUtils {

    /***
     * 签发JWT令牌
     *
     */
    public static String getToken(){
        String token = "";
        String STR = "yctxdy";//盐
        token = JWT.create().withAudience("hly")
                .withExpiresAt(new Date(System.currentTimeMillis() + 15 * 60 * 1000))//延时十五分钟
                .sign(Algorithm.HMAC256(STR));
        return  token;
    }
}

新建一个Interceptor包并新建一个Interceptor
在这里插入图片描述

public class Interceptor implements HandlerInterceptor {
    /**
     * 在DispatcherServlet之前执行
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器生效");
        //用HandlerMethod访问方法、方法上的注解、方法参数等等
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();

        //检查是否有PassToken注解,有则跳过认证
        if (method.isAnnotationPresent(PassToken.class)) {
            PassToken passToken = method.getAnnotation(PassToken.class);
            if (passToken.required()) {
                return true;
            }
        }


        String token = request.getHeader("token");
        // 判断一下token是否存在
        if (token == null || token.length() ==0){
            System.out.println("没哟登录");
            return false;
        }

        //验证token
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("****")).build();
        try{
            jwtVerifier.verify(token);
            return true;
        }catch (JWTVerificationException e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 在controller执行之后的DispatcherServlet之后执行
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 在页面渲染完成返回给客户端之前执行
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

新建一个CustomAnnotation包
在下面新建一个类型为Annotation的java class
命名为PassToken
用来跳过拦截
在这里插入图片描述

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface PassToken {
    boolean required() default true;
}

在这里插入图片描述

在test中写一个跳过拦截测试和不跳过拦截的测试
先试一下aaa的
在这里插入图片描述
在这里插入图片描述
被拦截了
再试ttt的
在这里插入图片描述
在这里插入图片描述
成功了

在aaa的header里加入token
在这里插入图片描述
成功获取

### JWT 验证实现方案 JWT(JSON Web Token)是一种广泛使用的安全令牌标准,用于身份验证和信息传递。其验证过程的核心在于确保接收到的 JWT 是合法且未被篡改的。 #### 1. **JWT 验证原理** JWT 的结构分为三部分:Header、Payload 和 Signature。验证的主要步骤如下: - 对 Header 进行 Base64 URL 解码,获取签名所用的算法。 - 使用相同的逻辑重新计算 header 和 payload 的签名。 - 将新生成的签名与 JWT 中的第三部分进行对比。如果两者一致,则说明该 JWT 合法;否则视为非法或已被篡改[^1]。 接收方在生成签名时需使用与发送方一致的密钥,这是保证数据完整性和真实性的重要条件。 #### 2. **Node.js 环境下的 JWT 验证实现** 以下是基于 Node.js 的 JWT 验证代码示例: ```javascript const jwt = require('jsonwebtoken'); // 验证函数 function verifyToken(token, secretKey) { try { const decoded = jwt.verify(token, secretKey); console.log("Decoded Payload:", decoded); // 输出解码后的负载信息 return true; } catch (err) { console.error("Verification failed", err.message); return false; } } // 测试用例 const token = 'your-jwt-token'; // 替换为实际的 JWT const secretKey = 'your-secret-key'; // 替换为实际的密钥 verifyToken(token, secretKey); ``` 此代码通过 `jsonwebtoken` 库实现了 JWT 的解析与验证功能[^2]。 #### 3. **Java 环境下 JWT 验证及其常见错误解决** 对于 Java 开发者来说,可能需要引入额外的依赖来处理某些环境中的兼容性问题。例如,在 JDK 版本较高时可能会因缺少必要的库而无法生成或验证 JWT。此时可以通过添加以下 Maven 依赖解决问题[^3]: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.1</version> </dependency> ``` 这些依赖能够有效修复由于高版本 JDK 缺失 jaxb-api 导致的异常。 #### 4. **JWT 登录踢出机制的设计思路** 当应用程序需要限制同一账户仅能在单一设备上登录时,可采用以下策略之一: - 设置较短的有效期(如五分钟),并配合刷新令牌(Refresh Token)。这种方式无需存储大量会话状态即可达到目的。 - 结合 Session 和 JWT 使用,利用 Session 记录当前活跃用户的唯一标识符,并定期同步至分布式缓存服务中以便快速查找已登出用户的信息。 - 更加严格的控制方式是对 IP 地址或其他网络特征加以绑定,从而进一步增强安全性[^5]。 ### 总结 以上介绍了关于如何实现以及排查 JWT 验证过程中可能出现的一些典型问题的具体方法论。无论是选用哪种技术栈开发的应用程序都可以找到适合自己的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值