实现本地锁,本地token功能 。
TimedCache类中put()设置的时间比newTimedCache()设置的时间优先级高,get()会刷新时间。
package com.navigation.berth.common.util; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.thread.ThreadUtil; import com.navigation.berth.entity.SysUser; /** * @author dll */ public class LocalCache { // 超过一分钟缓存自动删除 public static final TimedCache<String, String> LOCK = CacheUtil.newTimedCache(1000*3); public static final long TOKEN_ACTION_TIME = 24*60*60*1000; // 超过1天缓存自动删除 public static final TimedCache<String, SysUser> TOKENS = CacheUtil.newTimedCache(TOKEN_ACTION_TIME); static { /** 每100ms检查一次过期 */ LOCK.schedulePrune(100); /** 每10秒检查一次过期 */ TOKENS.schedulePrune(10000); } /** * 存入键值对,提供消逝时间 * * @param key * @param value * @param timeout */ public static void put(TimedCache<String, String> cache,String key, String value, Long timeout) { /** 设置消逝时间 */ cache.put(key, value, timeout); } /** * 每次重新get一次缓存,均会重新刷新消逝时间 * * @param key * @return */ public static String get(TimedCache<String, String> cache,String key) { return cache.get(key); } public static void setToken(String key, SysUser value) { TOKENS.put(key, value ,TOKEN_ACTION_TIME); } public static SysUser getToken(String key) { return TOKENS.get(key); } static Lock rtLock = new ReentrantLock(); public static boolean lock(String key, String value, Long timeout) { if (rtLock.tryLock()) { try { if (LOCK.containsKey(key)) { return false; } else { LocalCache.put(LOCK, key, "1", timeout); return true; } } finally { rtLock.unlock(); } } else { return false; } } public static void unLock(String key) { LOCK.remove(key); } public static void main(String[] args) { // put(LOCK,"haha", "1", 3000L); LOCK.put("haha", "1",2000L); ThreadUtil.sleep(2000); if (LOCK.containsKey("haha")) { System.out.println("aa"); } System.out.println("第1次结果:" + get(LOCK,"haha")); ThreadUtil.sleep(2000); System.out.println("第2次结果:" + get(LOCK,"haha")); ThreadUtil.sleep(3000); System.out.println("第3次结果:" + get(LOCK,"haha")); if (LOCK.containsKey("haha")) { System.out.println("aa"); } // // 取消定时清理 // LOCK.cancelPruneSchedule(); // Thread ta = new Thread(() -> { // System.out.println(lock("haha", "1", 3000L)); // }); // // Thread tb = new Thread(() -> { // System.out.println(lock("haha", "1", 3000L)); // }); // // ta.start(); ThreadUtil.sleep(10); // tb.start(); } }
login 方法
@ApiOperation(value = "登录接口", notes = "登录接口") @PostMapping(value="/login") public Result login(@RequestBody SysUser sysUser, HttpServletRequest request){ SysUser user = sysUserService.lambdaQuery().eq(SysUser::getUserName,sysUser.getUserName()).one(); Assert.notNull(user,"账号不存在"); Assert.equals(user.getUserPwd(),DigestUtil.md5Hex(sysUser.getUserPwd()),"密码错误"); // request.getSession().setAttribute("user",user); Map map = new HashMap<>(); String token = UUID.randomUUID().toString(); LocalCache.setToken(token,user); map.put("token",token); return Result.ok(map); }