jwt token的区别
时间: 2024-07-31 19:00:42 浏览: 51
JWT (JSON Web Token) 是一种开放的标准(RFC 7519),它用于在网络间安全地传输信息,特别常用于无状态的 API 授权。JWT 区别于其他类型的令牌(如 session cookies 或 basic auth credentials)有以下几个关键点:
1. **紧凑格式**:JWT 是一个 JSON 对象,包含三个部分:头部(Header)、负载(Payload)和签名(Signature)。它们由`.`分隔,并用 Base64 编码。
2. **无状态**:JWT 不需要服务器保存状态信息,客户端持有 JWT 即可完成身份验证。一旦生成并发送给用户,服务器不需要存储用户的登录状态。
3. **安全性**:通过数字签名(通常使用 RSA 或 HMAC 签名算法)保证数据完整性和真实性,防止篡改。
4. **可扩展**:JWT 可以携带任意键值对作为负载,使得其可以承载丰富的用户信息或请求上下文。
5. **生命周期管理**:虽然 JWT 客户端持有,但可以通过设置过期时间(exp claim)来控制其有效期限。
相关问题
/** * 判断token是否存在与有效 * @param jwtToken * @return */ public static boolean checkToken(String jwtToken) { if(ObjectUtils.isEmpty(jwtToken)) return false; try { Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 判断token是否存在与有效 * @param request * @return */ public static boolean checkToken(HttpServletRequest request) { try { String jwtToken = request.getHeader("token"); if(ObjectUtils.isEmpty(jwtToken)) return false; Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); } catch (Exception e) { e.printStackTrace(); return false; } return true; } /** * 根据token获取会员id * @param request * @return */ public static String getMemberIdByJwtToken(HttpServletRequest request) { String jwtToken = request.getHeader("token"); if(ObjectUtils.isEmpty(jwtToken)) return ""; Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); Claims claims = claimsJws.getBody(); return (String)claims.get("account"); }
这段代码实现了对 Token 的检查和解析,以及获取其中的信息。
其中,checkToken(String jwtToken) 方法用于检查传入的 jwtToken 是否有效,如果有效则返回 true,否则返回 false。该方法首先判断 jwtToken 是否为空,如果为空则直接返回 false。然后使用 Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken) 对 jwtToken 进行解析和验证,如果解析和验证成功,则返回 true,否则返回 false。
checkToken(HttpServletRequest request) 方法与 checkToken(String jwtToken) 方法类似,不同点在于它从请求头中获取 jwtToken,而不是作为参数传入该方法。
getMemberIdByJwtToken(HttpServletRequest request) 方法用于从 Token 中获取用户的账户信息。它首先从请求头中获取 jwtToken,然后使用 Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken) 对 jwtToken 进行解析和验证,然后获取其中的 "account" 字段的值,并将其作为字符串返回。
有个接口apis/Login/JWTToken3.0怎么代理成api/Login/JWTToken3.0
如果想要在 Vite 开发环境下通过代理将接口 `apis/Login/JWTToken3.0` 映射到相同的URL `api/Login/JWTToken3.0`,可以在 `vite.config.js` 文件中的 `proxy` 对象里配置。假设你已经设置了服务器监听的端口(默认是3000),可以这样做:
```javascript
export default defineConfig({
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8080', // 如果实际 API 位于本地其他端口(这里是8080为例)
pathRewrite: { '^/apis': '/' }, // 将 '/apis' 部分替换为 '/'
changeOrigin: true,
},
},
},
});
```
这个配置表示所有以 `/api` 开头的请求都将被转发到 `http://localhost:8080/api/Login/JWTToken3.0`。`pathRewrite` 用于处理原始路径的重写,这里的 `'^/apis': '/'` 意味着任何以 `/apis` 开始的路径会变成根路径 `/`。
阅读全文