springboot模板项目搭建:Jwt工具类公共返回对象类

Posted 杨咩咩yang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot模板项目搭建:Jwt工具类公共返回对象类相关的知识,希望对你有一定的参考价值。

完整项目连接:

使用idea创建springboot项目_杨咩咩-CSDN博客创建一个以后都可以使用的springboot后台项目,放入git中托管,后期创建别的项目时,直接拖下来,修改完项目名和包名时直接使用https://blog.csdn.net/yang1393214887/article/details/121371344

使用Springboot security 权限与Jwt

添加spring-boot-starter-security与Jwt依赖:

    <!-- spring security 依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!--  JWT 依赖 0.9.0与0.9.1版本不兼容 -->
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.0</version>
    </dependency>
  </dependencies>

配置application.yml:

jwt:
  # JWT存储的请求头
  tokenHeader: Authorization
  # JWT 加解密使用的密钥
  secret: xxxx
  # JWT的超期限时间(60*60*24)
  expiration: 604800
  # JWT 负载中拿到开头
  tokenHead: Bearer

编写JwtToken工具类:

包路径:package com.xxxx.server.config.security.component

可以被调用的方法有5个: 

package com.xxxx.server.config.security.component;

import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JwtToken工具类
 * @author yangxf
 */
@Component
public class JwtTokenUtil 

    // 指定JWT用户名的key常量
    private static final String CLAIM_KEY_USERNAME = "sub";
    // 指定JWT创建时间的key常量
    private static final String CLAIM_KEY_CREATED = "created";
    // 从配置文件获取密钥
    @Value("$jwt.secret")
    private String secret;
    // 从配置文件获取失效时间
    @Value("$jwt.expriation")
    private Long expiration;

    /**
     * 根据用户据信息生成token
     * @param userDetails
     * @return
     */
    public String generateToken(UserDetails userDetails) 
        Map<String,Object> claims = new HashMap<>();
        claims.put(CLAIM_KEY_USERNAME,userDetails.getUsername());
        claims.put(CLAIM_KEY_CREATED,new Date());
        return generateToken(claims);
    

    /**
     * 在token中获取登录用户名
     * @param token
     * @return
     */
    public String getUserNameFromToken(String token) 
        String username;
        try 
            Claims claims = getClaimsFromToken(token);
            username = claims.getSubject();
         catch (Exception e) 
            username = null;
        
        return username;
    

    /**
     * 验证token是否失效
     * @param token
     * @param userDetails
     * @return
     */
    public boolean validateToken(String token,UserDetails userDetails) 
        String username = getUserNameFromToken(token);
        return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
    

    /**
     * 判断token是否可以被刷新
     * @param token
     * @return
     */
    public boolean canRefrush(String token) 
        return !isTokenExpired(token);
    

    /**
     * 刷新token
     * @param token
     * @return
     */
    public String refrushToken(String token) 
        Claims claims = getClaimsFromToken(token);
        claims.put(CLAIM_KEY_CREATED, new Date());
        return generateToken(claims);
    
    /**
     * 判断token是否失效
     * @param token
     * @return
     */
    private boolean isTokenExpired(String token) 
        Date expireDate = getExpiredDateFromToken(token);
        return expireDate.before(new Date());
    

    /**
     * 从token获取失效时间
     * @param token
     * @return
     */
    private Date getExpiredDateFromToken(String token) 
        Claims claims = getClaimsFromToken(token);
        return claims.getExpiration();
    

    /**
     * 从token获取荷载
     * @param token
     * @return
     */
    private Claims getClaimsFromToken(String token) 
        Claims claims = null;
        try 
            claims = Jwts.parser()
            .setSigningKey(secret)
            .parseClaimsJws(token)
            .getBody();
         catch (Exception e) 
            e.printStackTrace();
        
        return claims;
    

    /**
     *根据荷载生成JWT Token
     * @param claims
     * @return
     */
    private String generateToken(Map<String,Object> claims) 
        return Jwts.builder()
                .setClaims(claims)
                .setExpiration(generateExpiration())
                .signWith(SignatureAlgorithm.ES512, secret)
                .compact();
    

    /**
     * 生成token失效时间
     * @return
     */
    private Date generateExpiration() 
        return new Date(System.currentTimeMillis() + expiration * 1000);
    

添加公共返回对象类:

package com.xxxx.server.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 公共返回对象
 *
 * @author yangxf
 * @since 1.0.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean 
	private long code;
	private String message;
	private Object obj;

	/**
	 * 成功返回结果
	 * @param message
	 * @return
	 */
	public static RespBean success(String message)
		return new RespBean(200,message,null);
	

	/**
	 * 成功返回结果
	 * @param message
	 * @param obj
	 * @return
	 */
	public static RespBean success(String message,Object obj)
		return new RespBean(200,message,obj);
	

	/**
	 * 失败返回结果
	 * @param message
	 * @return
	 */
	public static RespBean error(String message)
		return new RespBean(500,message,null);
	

	/**
	 * 失败返回结果
	 * @param message
	 * @param obj
	 * @return
	 */
	public static RespBean error(String message,Object obj)
		return new RespBean(500,message,obj);
	

以上是关于springboot模板项目搭建:Jwt工具类公共返回对象类的主要内容,如果未能解决你的问题,请参考以下文章

【Springboot】项目模块化

SpringBoot+JWT+Redis实现单用户登录

SpringCloud之微服务项目搭建-孰能生巧

Java项目常见工具类总结

JWT 工具类

JWT 工具类 #yyds干货盘点#