jwt签发工具类
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.wx.api.controller.user.domain.WxUser;
import com.ruoyi.wx.api.controller.user.mapper.WxUserMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.bouncycastle.util.encoders.Base64;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
/**
*
* jwt工具类
*
**/
public class JwtUtil {
/**
* 签发JWT
* @param subject 可以是JSON数据 尽可能少
* @param ttlMillis token有效时间
* @return String
*
*/
public static String createJWT(String subject, long ttlMillis) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
SecretKey secretKey = generalKey();
JwtBuilder builder = Jwts.builder()
.setId(IdUtils.simpleUUID()) //唯一性
.setSubject(subject) // 主题
.setIssuer("admin") // 签发者
.setIssuedAt(now) // 签发时间
.signWith(signatureAlgorithm, secretKey); // 签名算法以及密匙
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
builder.setExpiration(expDate); // 过期时间
}
return builder.compact();
}
/**
* 密钥
* @return
*/
public static SecretKey generalKey() {
byte[] encodedKey = Base64.decode("xxxxxxxx"); //自定义密钥, 不能外泄
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
/**
*
* 解析JWT字符串
* @param jwt
* @return
* @throws Exception
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}
/**
* 获取用户
* @param token
* @return
* @throws Exception
*/
public synchronized static WxUser getUser(String token) {
WxUser user = null;
String subject = null;
try {
subject = parseJWT(token).getSubject();
} catch (Exception e) {
e.printStackTrace();
}
WxUser userModel = JsonListUtil.jsonToBean(subject, WxUser.class);
if (ObjectUtil.isNotEmpty(userModel)) {
user = SpringUtil.getBean(WxUserMapper.class).selectWxUserById(userModel.getId());
}
return user;
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cglib.beans.BeanMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* JSON和List互转工具类
*/
public class JsonListUtil {
/**
* List<T> 转 json 保存到数据库
*/
public static <T> String listToJson(List<T> ts) {
String jsons = JSON.toJSONString(ts);
return jsons;
}
/**
* 对象转 json 保存到数据库
*/
public static <T> String objToJson(T ts) {
String jsons = JSON.toJSONString(ts);
return jsons;
}
/**
* json 转 List<T>
*/
public static <T> List<T> jsonToList(String jsonString, Class<T> clazz) {
List<T> ts = (List<T>) JSONArray.parseArray(jsonString, clazz);
return ts;
}
/**
* json 转 对象
*/
public static <T> T jsonToBean(String jsonString, Class<T> clazz) {
T t = JSON.parseObject(jsonString, clazz);
return t;
}
/**
* map转成实体类对象
*/
public static <T> T mapToBean(Map<String, Object> map, Class<T> clazz) {
T bean = null;
try {
bean = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
BeanMap beanMap = BeanMap.create(bean);
beanMap.putAll(map);
return bean;
}
/**
* map转字符串
* @param map
* @param <T>
* @return
*/
public static <T> String mapToStr(Map<String, Object> map) {
String jsonString = JSON.toJSONString(map);
return jsonString;
}
/**
* 字符串转map
* @param str
* @param <T>
* @return
*/
public static <T> Map<String, Object> strToMap(String str) {
JSONObject jsonObject = JSONObject.parseObject(str);
Map<String,Object> map = (Map<String,Object>)jsonObject;
return map;
}
/**
* 将对象装换为map
*
* @param bean
* @return
*/
public static <T> Map<String, Object> beanToMap(T bean) {
Map<String, Object> map = new HashMap<>();
if (bean != null) {
BeanMap beanMap = BeanMap.create(bean);
for (Object key : beanMap.keySet()) {
map.put(key + "", beanMap.get(key));
}
}
return map;
}
}
controller
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wx.api.controller.user.domain.WxUser;
import com.ruoyi.wx.utils.JwtUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
@RestController
@RequestMapping("/wx/api/user_test")
public class UserTestController {
/**
* JWT
*/
public static final String TOKEN = "Authorization";
public static final long JWT_TTL_TIME = 24 * 60 * 60 * 1000 * 365; // 1年(自定义有效期)
/**
* 登录
* @param response
* @return
*/
@GetMapping("/login")
public AjaxResult login(HttpServletResponse response) {
HashMap<String, Object> map = new HashMap<>();
map.put("id","1"); //用户id
// 生成令牌(token)
String token = JwtUtil.createJWT(JSON.toJSONString(map), JWT_TTL_TIME);
//把令牌信息存入到Cookie
Cookie cookie = new Cookie(TOKEN, token);
cookie.setDomain("localhost");
cookie.setPath("/");
response.addCookie(cookie);
System.out.println("token: "+token);
return AjaxResult.success(token);
}
/**
* 通过token获取用户
* @param request
* @return
*/
@GetMapping("/getUser")
public AjaxResult getUser(HttpServletRequest request) {
// 客户端请求携带token, 我们可以在header中获取
// WxUser user = JwtUtil.getUser(request.getHeader(TOKEN));
WxUser user = JwtUtil.getUser("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOWJiMzcxNTQ1MWQ0NThjYjU3Y2ZiZmRjY2ZmNDk4YyIsInN1YiI6IntcImlkXCI6XCIxXCJ9IiwiaXNzIjoiYWRtaW4iLCJpYXQiOjE2NTIzMzU4ODQsImV4cCI6MTY1MzgwNzExM30.mxn0HNdmaK_xnYsXlx3J5dhNgW3q07TX5sYg1nSJ3bc");
System.out.println("user: "+user);
return AjaxResult.success(user);
}
}
http://localhost:8009/wx/api/user_test/login
{
"msg": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOWJiMzcxNTQ1MWQ0NThjYjU3Y2ZiZmRjY2ZmNDk4YyIsInN1YiI6IntcImlkXCI6XCIxXCJ9IiwiaXNzIjoiYWRtaW4iLCJpYXQiOjE2NTIzMzU4ODQsImV4cCI6MTY1MzgwNzExM30.mxn0HNdmaK_xnYsXlx3J5dhNgW3q07TX5sYg1nSJ3bc",
"code": 200
}
http://localhost:8009/wx/api/user_test/getUser
{
"msg": "操作成功",
"code": 200,
"data": {
"searchValue": null,
"createBy": null,
"createTime": "2022-05-12 10:43:14",
"updateBy": null,
"updateTime": "2022-05-12 10:43:14",
"remark": null,
"params": {},
"id": 1,
"openid": "oXHHd5PmFI5Xf3D0cQNld-tJBBIA",
"unionid": "oUPj66l3kKyd46oXbrwN-aPgdjQQ",
"phoneNumber": null,
"nickName": "木笔",
"aliasName": "木笔",
"avatar": "https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKDKIibHfOlhMmLib2tU491TpbTzvjHtw2TL38LM30ao5KRZL0A20PIeyhJ8ZGWMvHUDSabatHhic1PQ/132",
"sex": "0",
"isDisable": 0,
"isNormal": 0
}
}