diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java b/mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java index 1c2809dde..709e4da2d 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/WechatLoginController.java @@ -29,9 +29,15 @@ import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import redis.clients.jedis.Protocol; +import redis.clients.util.SafeEncoder; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @@ -202,9 +208,19 @@ public class WechatLoginController extends BaseController { } else { // 跳转登录选择页面 String key = WECHAT_PREV + TOTP.generateWechatOpen(accessToken.getOpenId()); - openRedisTemplate.opsForValue().setIfAbsent(key, accessToken.getOpenId()); - // 设置过期时间 - openRedisTemplate.expire(key, 60, TimeUnit.SECONDS); + Boolean isAbsent = openRedisTemplate.execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + RedisSerializer valueSerializer = openRedisTemplate.getValueSerializer(); + RedisSerializer keySerializer = openRedisTemplate.getKeySerializer(); + Object obj = connection.execute("set", keySerializer.serialize(key), + valueSerializer.serialize(key), + SafeEncoder.encode("NX"), + SafeEncoder.encode("EX"), + Protocol.toByteArray(60)); // 60s 过期时间 + return obj != null; + } + }); List users = new ArrayList(); for(MallUserInfoVo user: userList) { DisplayUserInfo disUser = new DisplayUserInfo(); diff --git a/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java index e36fb40e4..5ab7caca6 100644 --- a/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkAdmin/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -7,10 +7,16 @@ import com.iformall.utils.IPUtil; import com.iformall.utils.UrlCheck; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import redis.clients.jedis.Protocol; +import redis.clients.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -78,8 +84,20 @@ public class RequestInterceptor extends HandlerInterceptorAdapter { sb.append(resultBody); String key = "request-" + HashUtil.md5(sb.toString()); - if (redisTemplate.opsForValue().setIfAbsent(key, key)) { - redisTemplate.expire(key, 3, TimeUnit.SECONDS); + Boolean isAbsent = redisTemplate.execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + RedisSerializer valueSerializer = redisTemplate.getValueSerializer(); + RedisSerializer keySerializer = redisTemplate.getKeySerializer(); + Object obj = connection.execute("set", keySerializer.serialize(key), + valueSerializer.serialize(key), + SafeEncoder.encode("NX"), + SafeEncoder.encode("EX"), + Protocol.toByteArray(3)); // 3s + return obj != null; + } + }); + if (isAbsent) { logger.info(key + ": 第一次提交"); return true; } diff --git a/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java index 2af9d1b15..237bbbda7 100644 --- a/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkBApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -4,10 +4,16 @@ import com.iformall.utils.HashUtil; import com.iformall.utils.IPUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import redis.clients.jedis.Protocol; +import redis.clients.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -70,8 +76,20 @@ public class RequestInterceptor extends HandlerInterceptorAdapter { sb.append(resultBody); String key = "request-" + HashUtil.md5(sb.toString()); - if (redisTemplate.opsForValue().setIfAbsent(key, key)) { - redisTemplate.expire(key, 3, TimeUnit.SECONDS); + Boolean isAbsent = redisTemplate.execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + RedisSerializer valueSerializer = redisTemplate.getValueSerializer(); + RedisSerializer keySerializer = redisTemplate.getKeySerializer(); + Object obj = connection.execute("set", keySerializer.serialize(key), + valueSerializer.serialize(key), + SafeEncoder.encode("NX"), + SafeEncoder.encode("EX"), + Protocol.toByteArray(3)); // 3s + return obj != null; + } + }); + if (isAbsent) { logger.info(key + ": 第一次提交"); return true; } diff --git a/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java b/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java index 4c2e2e170..c811c6b12 100644 --- a/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java +++ b/mallinkCApi/src/main/java/com/iformall/interceptor/RequestInterceptor.java @@ -4,10 +4,16 @@ import com.iformall.utils.HashUtil; import com.iformall.utils.IPUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.dao.DataAccessException; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.stereotype.Component; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import redis.clients.jedis.Protocol; +import redis.clients.util.SafeEncoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -72,8 +78,20 @@ public class RequestInterceptor extends HandlerInterceptorAdapter { sb.append(resultBody); String key = "request-" + HashUtil.md5(sb.toString()); - if (redisTemplate.opsForValue().setIfAbsent(key, key)) { - redisTemplate.expire(key, 3, TimeUnit.SECONDS); + Boolean isAbsent = redisTemplate.execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + RedisSerializer valueSerializer = redisTemplate.getValueSerializer(); + RedisSerializer keySerializer = redisTemplate.getKeySerializer(); + Object obj = connection.execute("set", keySerializer.serialize(key), + valueSerializer.serialize(key), + SafeEncoder.encode("NX"), + SafeEncoder.encode("EX"), + Protocol.toByteArray(3)); // 3s + return obj != null; + } + }); + if (isAbsent) { logger.info(key + ": 第一次提交"); logger.debug("preHandle start 2"); return true;