From b3f851fe91664afe5f31e5dd2e5026c74e4ccec4 Mon Sep 17 00:00:00 2001 From: 13693261870 <252740454@qq.com> Date: 星期三, 02 七月 2025 16:42:11 +0800 Subject: [PATCH] 解决tokenService与userService循环调用 --- src/main/java/com/lf/server/service/sys/TokenService.java | 209 +++++++++++++++++++++++++++++++-------------------- 1 files changed, 127 insertions(+), 82 deletions(-) diff --git a/src/main/java/com/lf/server/service/sys/TokenService.java b/src/main/java/com/lf/server/service/sys/TokenService.java index 31c2720..de1243f 100644 --- a/src/main/java/com/lf/server/service/sys/TokenService.java +++ b/src/main/java/com/lf/server/service/sys/TokenService.java @@ -1,5 +1,6 @@ package com.lf.server.service.sys; +import com.lf.server.entity.all.SettingData; import com.lf.server.entity.sys.LoginEntity; import com.lf.server.entity.sys.TokenEntity; import com.lf.server.entity.sys.UserEntity; @@ -7,10 +8,11 @@ import com.lf.server.helper.StringHelper; import com.lf.server.helper.WebHelper; import com.lf.server.mapper.sys.TokenMapper; +import com.lf.server.mapper.sys.UserMapper; import com.lf.server.service.all.RedisService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; @@ -22,34 +24,47 @@ * @author sws * @date 2022-09-28 */ - @Service public class TokenService implements TokenMapper { - @Autowired - private RedisService redisService; - - @Autowired + @Resource TokenMapper tokenMapper; - @Autowired - UserService usersService; + @Resource + UserMapper userMapper; - @Autowired + @Resource LoginService loginService; + @Resource + RedisService redisService; + @Override - public Integer selectCount(String token) { - return tokenMapper.selectCount(token); + public Integer selectCount(String name, Integer type) { + name = StringHelper.getLikeUpperStr(name); + + return tokenMapper.selectCount(name, type); } @Override - public List<TokenEntity> selectByPage(String token, Integer limit, Integer offset) { - return tokenMapper.selectByPage(token, limit, offset); + public List<TokenEntity> selectByPage(String name, Integer type, Integer limit, Integer offset) { + name = StringHelper.getLikeUpperStr(name); + + return tokenMapper.selectByPage(name, type, limit, offset); } @Override public TokenEntity selectToken(int id) { return tokenMapper.selectToken(id); + } + + @Override + public List<TokenEntity> selectByIds(List<Integer> ids) { + return tokenMapper.selectByIds(ids); + } + + @Override + public TokenEntity selectOneById(Integer id) { + return tokenMapper.selectOneById(id); } @Override @@ -74,11 +89,27 @@ @Override public Integer deleteToken(int id) { + TokenEntity entity = tokenMapper.selectToken(id); + if (null == entity) { + return 0; + } + + clearCache(entity.getToken()); + return tokenMapper.deleteToken(id); } @Override public Integer deleteTokens(List<Integer> ids) { + List<TokenEntity> list = tokenMapper.selectByIds(ids); + if (null == list || list.isEmpty()) { + return 0; + } + + for (TokenEntity entity : list) { + clearCache(entity.getToken()); + } + return tokenMapper.deleteTokens(ids); } @@ -89,37 +120,36 @@ @Override public Integer updateTokenExpire(TokenEntity tokenEntity) { + clearCache(tokenEntity.getToken()); + return tokenMapper.updateTokenExpire(tokenEntity); } /** * 鑾峰彇鏂扮殑浠ょ墝瀹炰綋绫� - * - * @param userid - * @param req - * @return */ - public TokenEntity getNewToken(int userid, HttpServletRequest req) { - int duration = 240; + public TokenEntity getNewToken(UserEntity ue, HttpServletRequest req) { + return getNewToken(0, SettingData.TOKEN_EXPIRE, ue, req); + } + /** + * 鑾峰彇鏂扮殑浠ょ墝瀹炰綋绫� + */ + public TokenEntity getNewToken(Integer type, Integer min, UserEntity ue, HttpServletRequest req) { TokenEntity te = new TokenEntity(); te.setToken(WebHelper.getGuid()); - te.setDuration(duration); - te.setExpire(WebHelper.getTimestamp(duration)); - te.setType(0); + te.setDuration(min); + te.setExpire(WebHelper.getTimestamp(min)); + te.setType(type); te.setIp(WebHelper.getIpAddress(req)); - te.setCreateUser(userid); - + te.setCreateUser(ue.getId()); + te.setUname(ue.getUname()); return te; } /** * 鏄�/鍚︾櫥褰� - * - * @param req - * @param res - * @return */ public Boolean isLogin(HttpServletRequest req, HttpServletResponse res) { String token = WebHelper.getToken(req); @@ -127,37 +157,22 @@ return false; } - // redis - String tokenKey = RedisCacheKey.signTokenKey(token); - if (redisService.hasKey(tokenKey)) { - return true; - } + TokenEntity te = getEntityByToken(token); - // db - TokenEntity te = selectOneByToken(token); - if (te != null) { - redisService.put(tokenKey, te, te.getDuration(), TimeUnit.MINUTES); - return true; - } - - return false; + return null != te; } /** * 鐧诲嚭 - * - * @param token - * @param req - * @return */ public Boolean logout(String token, HttpServletRequest req, HttpServletResponse res) { TokenEntity te = getEntityByToken(token); - if (te == null) { + if (null == te) { return false; } - // 娓呴櫎Cookie WebHelper.saveCookie(StaticData.TOKEN_COOKIE_KEY, "", 60, res) - WebHelper.deleteAll(req, res); + // 娓呴櫎Cookie + WebHelper.deleteCookies(req, res); // 鑾峰彇褰撳墠鐢ㄦ埛 UserEntity ue = getCurrentUser(req); @@ -165,49 +180,49 @@ return false; } - // 娓呴櫎缂撳瓨 - String tokenKey = RedisCacheKey.signTokenKey(token); - redisService.delete(tokenKey); - String userKey = RedisCacheKey.signUserKey(te.getToken()); - redisService.delete(userKey); - // db锛岃缃护鐗岃繃鏈� te.setUpdateUser(ue.getId()); Integer rows = updateTokenExpire(te); - if (rows == 0) { + if (0 == rows) { return false; } // 鍐欐棩蹇� - LoginEntity le = loginService.getNewLogin(ue.getId(), 3, req); + LoginEntity le = loginService.getNewLogin(ue.getId(), 1, 3, 1, req); rows = loginService.insertLogin(le); return rows > 0; } /** + * 娓呴櫎缂撳瓨 + */ + public void clearCache(String token) { + String tokenKey = RedisCacheKey.signTokenKey(token); + redisService.delete(tokenKey); + String userKey = RedisCacheKey.signUserKey(token); + redisService.delete(userKey); + } + + /** * 鏍规嵁浠ょ墝鑾峰彇瀹炰綋 - * - * @param token - * @return */ public TokenEntity getEntityByToken(String token) { - if (StringHelper.isNull(token)) { - return null; - } - String tokenKey = RedisCacheKey.signTokenKey(token); // redis Object obj = redisService.get(tokenKey); - if (obj != null && obj instanceof TokenEntity) { + if (obj instanceof TokenEntity) { return (TokenEntity) obj; } // db TokenEntity te = selectOneByToken(token); - if (te != null) { - redisService.put(tokenKey, te, te.getDuration(), TimeUnit.MINUTES); + if (null != te) { + long min = StringHelper.getMinuteDifference(te.getExpire()); + if (min > 0) { + redisService.put(tokenKey, te, min, TimeUnit.MINUTES); + } } return te; @@ -215,10 +230,6 @@ /** * 淇濆瓨token - * - * @param te - * @param req - * @param res */ public void saveToken(UserEntity ue, TokenEntity te, HttpServletRequest req, HttpServletResponse res) { // 淇濆瓨鑷矯ookie @@ -235,33 +246,67 @@ /** * 鑾峰彇褰撳墠鐢ㄦ埛 - * - * @param req - * @return */ public UserEntity getCurrentUser(HttpServletRequest req) { String token = WebHelper.getToken(req); + + return getUserByToken(token); + } + + /** + * 鏍规嵁浠ょ墝鑾峰彇鐢ㄦ埛 + */ + public UserEntity getUserByToken(String token) { if (StringHelper.isNull(token)) { return null; } - String userKey = RedisCacheKey.signUserKey(token); - // redis + String userKey = RedisCacheKey.signUserKey(token); Object obj = redisService.get(userKey); - if (obj != null && obj instanceof UserEntity) { + if (obj instanceof UserEntity) { return (UserEntity) obj; } // db - UserEntity ue = usersService.selectByToken(token); - if (ue != null) { - TokenEntity te = getEntityByToken(token); - if (te != null) { - redisService.put(userKey, ue, te.getDuration(), TimeUnit.MINUTES); - } + UserEntity ue = userMapper.selectByToken(token); + if (null != ue) { + getEntityByToken(token); } return ue; } + + /** + * 璁剧疆瀵嗙爜閿欒缂撳瓨 + */ + public void setPwdErrCache(UserEntity ue) { + String key = RedisCacheKey.signPwdError(ue.getUid()); + Object objCount = redisService.get(key); + + int count = objCount == null ? 1 : (int) objCount + 1; + redisService.put(key, count, SettingData.PWD_ERR_TIME, TimeUnit.MINUTES); + + // 璁板綍鏃ュ織 + HttpServletRequest req = WebHelper.getRequest(); + LoginEntity le = loginService.getNewLogin(ue.getId(), 1, 1, 0, req); + le.setDescr("瀵嗙爜涓嶆纭�"); + loginService.insertLogin(le); + + if (count >= SettingData.PWD_ERR_COUNT) { + String token = WebHelper.getToken(req); + HttpServletResponse res = WebHelper.getResponse(); + logout(token, req, res); + } + } + + /** + * 鐢ㄦ埛ID鏄�/鍚︾鐢� + */ + public boolean isUidDisable(UserEntity ue) { + String key = RedisCacheKey.signPwdError(ue.getUid()); + Object objCount = redisService.get(key); + + return null != objCount && (int) objCount >= SettingData.PWD_ERR_COUNT; + } } -- Gitblit v1.9.3