Jwt实现token创建与解析,异常处理

引入pom

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

 

package com.xzh.utils;

import com.alibaba.fastjson.JSON;
import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.Date;

/**
 * @author 向振华
 * @date 2021/01/19 09:48
 */
@Slf4j
public class TokenUtils {

    private static final String JWT_SIGNING = "xiangzhenhua";
    private static final Long TOKEN_EXPIRE_TIME = 60000L;

    /**
     * 创建token
     *
     * @param json
     * @return
     */
    public static String build(String json) {
        return Jwts.builder()
                .setSubject(json)
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRE_TIME))
                .signWith(SignatureAlgorithm.HS512, JWT_SIGNING)
                .compact();
    }

    /**
     * 将token解析成实体类
     *
     * @param token
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T get(String token, Class<T> clazz) {
        if (StringUtils.isBlank(token)) {
            throw new RuntimeException("Token为空");
        }
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(JWT_SIGNING)
                    .parseClaimsJws(token)
                    .getBody();
            return JSON.parseObject(claims.getSubject(), clazz);
        } catch (ExpiredJwtException e) {
            log.error("JWT过期:", e);
            throw new RuntimeException("JWT过期");
        } catch (UnsupportedJwtException e) {
            log.error("不支持的JWT:", e);
            throw new RuntimeException("不支持的JWT");
        } catch (MalformedJwtException e) {
            log.error("JWT格式错误:", e);
            throw new RuntimeException("JWT格式错误");
        } catch (SignatureException e) {
            log.error("签名异常:", e);
            throw new RuntimeException("签名异常");
        } catch (IllegalArgumentException e) {
            log.error("非法请求:", e);
            throw new RuntimeException("非法请求");
        } catch (Exception e) {
            log.error("解析异常:", e);
            throw new RuntimeException("解析异常");
        }
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx 可以通过 `ngx_http_lua_module` 模块的 Lua 脚本来实现灰度发布。具体实现过程如下: 1. 在 Nginx 配置文件中添加 `ngx_http_lua_module` 模块的配置信息: ```nginx http { ... lua_package_path "/path/to/lua/?.lua;;"; lua_shared_dict gray_users 10m; ... } ``` 这里我们指定了 Lua 脚本的路径,并创建了一个名为 `gray_users` 的共享内存区域,用于存储灰度用户的信息。 2. 编写 Lua 脚本来判断用户是否在灰度中。在脚本中,我们需要先解析JWT Token 中的用户 ID,然后查询 `gray_users` 共享内存区域,看看该用户是否在灰度中。如果在灰度中,则将请求转发到灰度环境,否则转发到生产环境。 ```lua -- 加载必要的 Lua 库 local jwt = require "resty.jwt" local cjson = require "cjson" -- 解析 JWT Token 中的用户 ID local auth_header = ngx.var.http_Authorization if not auth_header then ngx.exit(ngx.HTTP_UNAUTHORIZED) end local token = string.sub(auth_header, 8) local jwt_obj = jwt:load_jwt(token) local user_id = jwt_obj.payload["user_id"] -- 查询用户是否在灰度中 local gray_users = ngx.shared.gray_users if gray_users:get(user_id) then -- 如果用户在灰度中,则转发到灰度环境 ngx.var.upstream = "gray_backend" else -- 如果用户不在灰度中,则转发到生产环境 ngx.var.upstream = "prod_backend" end ``` 在这个示例中,我们使用 `resty.jwt` 库来解析 JWT Token,并使用 `ngx.shared` API 来访问共享内存区域 `gray_users`。如果用户在灰度中,则将 `upstream` 变量设置为 `gray_backend`,否则设置为 `prod_backend`。这样,Nginx 就会将请求转发到相应的后端服务器。 3. 在 Nginx 配置文件中添加一个新的 `location` 配置块,用于指定 Lua 脚本的执行位置: ```nginx location /api { access_by_lua_file /path/to/lua/script.lua; proxy_pass http://$upstream; } ``` 这里我们将 Lua 脚本的执行位置设置为 `/api` 路径下的所有请求。当 Nginx 收到请求时,会先执行 Lua 脚本来判断用户是否在灰度中,然后根据 Lua 脚本设置的 `upstream` 变量来决定请求转发到哪个后端服务器。 需要注意的是,这只是一个简单的示例,实际的应用中还需要考虑安全性、性能等方面的问题,例如如何处理异常情况、如何设置灰度用户列表、如何优化 Lua 脚本性能等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值