博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JWT工具类
阅读量:3951 次
发布时间:2019-05-24

本文共 7215 字,大约阅读时间需要 24 分钟。

io.jsonwebtoken
jjwt
0.9.1
package com.example.mongodemo.util;import com.example.mongodemo.code.JWTCode;import io.jsonwebtoken.*;import org.apache.commons.codec.binary.Base64;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import java.util.Date;import java.util.concurrent.TimeUnit;public class JWTUtil{
private final static Logger logger = LoggerFactory.getLogger(JWTUtil.class); /* * 密文,用于加密解密Signature */ private static final String JWT_SECRET = "fnarip*fudasfasfas5fa9sdf_jcewdiudsad56161bfof_1564d16"; /** * 创建jwt * * @param id 用户的id * @param ttlMillis 过期的时间长度 * @return token串 * @throws Exception */ public static String createJWT(String id, long ttlMillis) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; long nowMillis = System.currentTimeMillis();// 签发jwt的时间 SecretKey key = generalKey(); JwtBuilder builder = Jwts.builder().setIssuedAt(new Date())// 签发时间 .claim("openId", id)// 用户id .signWith(signatureAlgorithm, key).setExpiration(new Date(nowMillis + ttlMillis));// System.out.println(nowMillis );// System.out.println( ttlMillis); return builder.compact(); } /** * 生成加密秘钥 * * @return 秘钥 */ private static SecretKey generalKey() {
String stringKey = JWT_SECRET;// 秘钥 byte[] encodedKey = Base64.decodeBase64(stringKey); SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); return key; } /** * 验证token * * @param jwt token串 * @return * @throws Exception */ public static Claims parseJWT(String jwt) throws RuntimeException {
SecretKey key = generalKey(); Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(jwt).getBody(); return claims; } /** * 验证token并返回信息 * @param token * @return */ public static JWTCode judgeToken(String token){
try{
parseJWT(token); } catch (ExpiredJwtException e) {
logger.info("token过期!",e); return JWTCode.OVERDUE; } catch (Exception e) {
logger.info("token无效!",e); return JWTCode.ERROR; } return JWTCode.SUCCESS; } public static String getOpenId(HttpServletRequest request){
String token = request.getHeader("token"); String openId = ""; try {
openId = parseJWT(token).get("openId").toString(); } catch (Exception e){
System.out.println("tokn解析openId失败"); logger.error("tokn解析openId失败!",e); return null; } return openId; } public static void main(String[] args) {
try {
String token = createJWT("asdfafas",TimeUnit.HOURS.toMillis(10)); Cookie cookie = StringUtil.setCookie("mwentoken",token, (int)TimeUnit.HOURS.toMillis(10)) ; String value =StringUtil.getCookie("mwentoken",new Cookie[]{
cookie}); System.out.println(value); System.out.println(token); System.out.println( parseJWT(value).get("openId").toString());// System.out.println(JWTUtils.parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1NDQwODQ2NDUsInVOYW1lIjoiaGFuaGFvIiwidUlkIjoiOSIsImV4cCI6MTU0NTg4NDY0NX0.NrqMOWG0AadZUX1ZHkQukZakRz-SgOLqrKjytBEb33c").get("uName").toString()); } catch (ExpiredJwtException e) {
System.out.println("token过期"); } catch (Exception e) {
System.out.println("token无效!!!"); e.printStackTrace(); } }}
package com.example.mongodemo.util;import com.example.mongodemo.dto.ResultDTO;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/** * @Author lyr * @create 2020/3/26 17:10 * * https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index * * 增加微信登录功能 * */public  class StringUtil {
//TODO:记得改过来 private static String TOKEN = "config"; public static String md5(String... args) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5"); String res = String.join("", args); return new String(messageDigest.digest(res.getBytes())); } /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] {
TOKEN, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (String s : arr) {
content.append(s); } MessageDigest md = null; String tmpStr = null; try {
md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) {
e.printStackTrace(); } // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null && tmpStr.equals(signature.toUpperCase()); } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) {
StringBuilder strDigest = new StringBuilder(); for (int i = 0; i < byteArray.length; i++) {
strDigest.append(byteToHexStr(byteArray[i])); } return strDigest.toString(); } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) {
char[] Digit = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; return new String(tempArr); } public static Cookie setCookie(String name, String value, int time) throws UnsupportedEncodingException {
String v = URLEncoder.encode(value, "utf-8"); Cookie cookie = new Cookie(name,v); cookie.setMaxAge((int) time); cookie.setPath("/"); return cookie; } public static String getCookie(String key,Cookie[] cookie) throws UnsupportedEncodingException {
for (int i=0;i
package com.example.mongodemo.code;/** * @Author lyr * @create 2020/3/28 12:26 */public enum JWTCode {
SUCCESS,ERROR,OVERDUE;}

转载地址:http://jauzi.baihongyu.com/

你可能感兴趣的文章
数塔 HDU - 2084 (简单的dp)
查看>>
超级楼梯 HDU - 2041 ( 简单的dp )
查看>>
Piggy-Bank HDU - 1114 ( 完全背包 )
查看>>
Knapsack problem FZU - 2214 ( 01背包 )
查看>>
瞌睡 (网易笔试题)
查看>>
1009 说反话 (20 分)
查看>>
1010 一元多项式求导 (25 分)
查看>>
1011 A+B 和 C (15 分)
查看>>
1012 数字分类 (20 分)
查看>>
1013 数素数 (20 分)
查看>>
1014 福尔摩斯的约会 (20 分)
查看>>
1015 德才论 (25 分)
查看>>
1016 部分A+B (15 分)
查看>>
1017 A除以B (20 分)
查看>>
1019 数字黑洞 (20 分)
查看>>
1032 挖掘机技术哪家强 (20 分)
查看>>
今夕何夕 HDU - 6112 ( 模拟 )
查看>>
Dividing HDU - 1059 ( 多重背包 - 二进制简化 )
查看>>
Robberies HDU - 2955 ( 0-1背包 )
查看>>
FATE HDU - 2459 ( 二维完全背包 )
查看>>