JWT spring boot JAVA 使用步骤 spring boot2.0
前言
JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
使用
- 添加依赖
https://jwt.io/
选择对应的版本 - 使用
import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.Claim; import com.auth0.jwt.interfaces.DecodedJWT; import org.springframework.util.StringUtils; public class TokenConfig { /** token秘钥,请勿泄露,请勿随便修改 backups:JKKLJOoasdlfj */ public static final String SECRET = "JKKLJOoasdlfj"; /** token 过期时间: 10天 */ public static final int calendarField = Calendar.DATE; public static final int calendarInterval = 10; /** * JWT生成Token.<br/> * * JWT构成: header, payload, signature * * @param user_id * 登录成功后用户user_id, 参数user_id不可传空 */ public static String createToken(Long user_id) throws Exception { Date iatDate = new Date(); // expire time Calendar nowTime = Calendar.getInstance(); nowTime.add(calendarField, calendarInterval); Date expiresDate = nowTime.getTime(); // header Map Map<String, Object> map = new HashMap<>(); map.put("alg", "HS256"); map.put("typ", "JWT"); // build token // param backups {iss:Service, aud:APP} String token = JWT.create().withHeader(map) // header .withClaim("iss", "Service") // payload .withClaim("aud", "APP").withClaim("user_id", null == user_id ? null : user_id.toString()) .withIssuedAt(iatDate) // sign time .withExpiresAt(expiresDate) // expire time .sign(Algorithm.HMAC256(SECRET)); // signature return token; } /** * 解密Token * * @param token * @return * @throws Exception */ public static Map<String, Claim> verifyToken(String token) { DecodedJWT jwt = null; try { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); jwt = verifier.verify(token); } catch (Exception e) { // e.printStackTrace(); // token 校验失败, 抛出Token验证非法异常 } return jwt.getClaims(); } /** * 根据Token获取user_id * * @param token * @return user_id */ public static Long getAppUID(String token) { Map<String, Claim> claims = verifyToken(token); Claim user_id_claim = claims.get("user_id"); if (null == user_id_claim || StringUtils.isEmpty(user_id_claim.asString())) { // token 校验失败, 抛出Token验证非法异常 } return Long.valueOf(user_id_claim.asString()); } }
概念解析
JWT 的三个部分依次如下。
- Header(头部)
- Payload(负载)
- Signature(签名)
写成一行,就是下面的样子。
项目源码(不定期更新)
(服务端)
https://github.com/DerrickTel/YiJiClientServer
(Web控制台(React))
https://github.com/DerrickTel/YiJiWeb
(RN APP端)
https://github.com/DerrickTel/YiJi
索引:
https://blog.csdn.net/achenyuan/article/details/80829401
https://www.geek-share.com/detail/2743337058.html
- springboot 2.0 使用Hikari连接池(号称java平台最快的,替换druid)
- (41)Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
- 重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API
- 使用Java(Springboot)操作Redis
- Spring Boot 使用Java代码创建Bean并注册到Spring中
- 【JAVA-OSS】如何在spring-boot项目中使用oss上传下载文件
- 使用Java(Springboot)操作Redis
- Java 9 和Spring Boot 2.0纷纷宣布支持的HTTP/2到底是什么?
- 结合SPRING 2.0使用JAVA PERSISTENCE API
- spring boot + kafka 使用详细步骤
- SpringBoot项目中使用redis缓存的方法步骤
- 使用Java(Springboot)操作Redis
- 使用Java(Springboot)操作Redis
- spring boot2.0使用redis做缓存
- Java 9 和Spring Boot 2.0纷纷宣布支持的HTTP/2到底是什么?
- 使用Java(Springboot)操作Redis
- 结合SPRING 2.0使用JAVA PERSISTENCE API
- 重拾后端之Spring Boot(四):使用JWT和Spring Security保护REST API
- 以ActiveMQ为例JAVA消息中间件学习【3】——SpringBoot中使用ActiveMQ
- 详解Spring Boot 中使用 Java API 调用 lucene