jwt生成token做登录校验

 

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
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用hutool生成jwt token,你需要在项目中引入hutool-all的依赖。具体的依赖配置如下所示: ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.13</version> </dependency> ``` 在登录接口中,如果账号密码校验成功,你可以使用用户id和用户类型创建jwt token,并将其设置为永不过期。然后,你可以更新登录日期,并将其作为一个值(B)存储在redis中,以便后续验证。在登录结果中,你可以返回一个json格式的响应,其中包含"result"为"success","token"为A的键值对。用户在接口请求header中携带token进行登录,后端可以通过拦截器解析token,获取userId和用户类型。如果解析失败,则返回一个json响应,表示Token验证不通过。如果解析成功,后端可以验证redis中的缓存key是否存在。如果不存在,则返回一个json响应,表示会话过期请重新登录。如果缓存key存在,则可以自动续7天的超时时间,以实现频繁登录用户的免登陆功能。在接口方法中,你可以直接获取登录用户的信息,将userId和用户类型放入request参数中。如果用户修改密码或退出登录,你可以废除access_tokens,即删除对应的缓存key。\[2\] 请注意,以上是一个大致的流程,具体实现可能会根据你的项目需求有所不同。 #### 引用[.reference_title] - *1* [利用hutool生成和验证JWT的示例](https://blog.csdn.net/qq125281823/article/details/120960181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [JWT生成token及过期和自动续期](https://blog.csdn.net/jq1223/article/details/114580020)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yixian123.com

谢谢打赏,祝老板心想事成

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值