Przeglądaj źródła

1、登录bug修改

machaoyi 1 rok temu
rodzic
commit
c5d0c8906f

+ 38 - 22
application/src/main/java/com/ctsi/Auth/web/login.java

@@ -14,8 +14,11 @@ import com.ctsi.System.SysUserDetail.service.SysUserDetailService;
 import com.ctsi.utils.ApiResult;
 import com.ctsi.utils.CaptchaUtil;
 import com.ctsi.utils.PasswordEncoderUtil;
+import com.ctsi.utils.RedisUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
@@ -26,6 +29,7 @@ import javax.servlet.http.HttpSession;
 import java.io.IOException;
 import java.util.Base64;
 import java.util.List;
+import java.util.UUID;
 
 @Api(tags = "授权")
 @RestController
@@ -39,31 +43,40 @@ public class login {
     private SysMenuService sysMenuService;
     @Resource
     private SysUserDetailService sysUserDetailService;
+    @Resource
+    private RedisUtil redisUtil;
+    private static final Logger log = LoggerFactory.getLogger(login.class);
     @ApiOperation("登录")
     @PostMapping(value = "/login",name = "登录")
     public ApiResult auth(@RequestBody UserForm userForm, HttpServletRequest request){
-        // 验证码校验是否开启
-        if (captchaType) {
-            // 从 Session 中获取之前生成的验证码
-            HttpSession session = request.getSession();
-            String storedCaptcha = (String) session.getAttribute("captcha");
-            if (storedCaptcha == null)
-                return ApiResult.result(ErrorCodeEnum.CAPTCHA_INVALID);
-            // 从 Session 中删除验证码
-            session.removeAttribute("captcha");
-            // 比较传入的验证码和 Session 中的验证码是否相等
-            if (!storedCaptcha.equalsIgnoreCase(userForm.getCaptcha()))
-                return ApiResult.result(ErrorCodeEnum.CAPTCHA_INVALID);
+        try {
+            // 验证码校验是否开启
+            if (captchaType) {
+                // 从 Session 中获取之前生成的验证码
+                HttpSession session = request.getSession();
+                String storedCaptcha = (String) session.getAttribute("captcha");
+                if (storedCaptcha == null)
+                    return ApiResult.result(ErrorCodeEnum.CAPTCHA_INVALID);
+                // 从 Session 中删除验证码
+                session.removeAttribute("captcha");
+                // 比较传入的验证码和 Session 中的验证码是否相等
+                if (!storedCaptcha.equalsIgnoreCase(userForm.getCaptcha()))
+                    return ApiResult.result(ErrorCodeEnum.CAPTCHA_INVALID);
+            }
+            SysUser User = sysUserService.queryByUserName(userForm.getUserName());
+            if (User == null)
+                return ApiResult.result(ErrorCodeEnum.USER_NOT_FOUND);
+            if (!PasswordEncoderUtil.checkPassword(userForm.getPassword(), User.getPassword()))
+                return ApiResult.result(ErrorCodeEnum.PASSWORD_INVALID);
+            boolean rememberMe = userForm.getRememberMe() != null && userForm.getRememberMe();
+            StpUtil.login(User.getId(), rememberMe);
+            TokenInfoPO tokenInfoPO = new TokenInfoPO();
+            BeanUtils.copyProperties(StpUtil.getTokenInfo(), tokenInfoPO);
+            return ApiResult.result(ApiResult.DEFAULT_SUCCEED_CODE, "登录成功", tokenInfoPO);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            return ApiResult.failure("登录失败",e.getMessage());
         }
-        SysUser User =  sysUserService.queryByUserName(userForm.getUserName());
-        if(User == null)
-            return ApiResult.result(ErrorCodeEnum.USER_NOT_FOUND);
-        if (!PasswordEncoderUtil.checkPassword(userForm.getPassword(),User.getPassword()))
-            return ApiResult.result(ErrorCodeEnum.PASSWORD_INVALID);
-        StpUtil.login(User.getId(),userForm.getRememberMe());
-        TokenInfoPO tokenInfoPO = new TokenInfoPO();
-        BeanUtils.copyProperties(StpUtil.getTokenInfo(), tokenInfoPO);
-        return ApiResult.result(ApiResult.DEFAULT_SUCCEED_CODE, "登录成功", tokenInfoPO);
     }
 
     @ApiOperation("登出")
@@ -96,10 +109,13 @@ public class login {
     @GetMapping("/captcha")
     public ApiResult getCaptcha(HttpServletRequest request) {
         try {
-            byte[] captchaImage = CaptchaUtil.generateCaptcha(request.getSession());
+            String captcha = CaptchaUtil.generateRandomString();
+            byte[] captchaImage = CaptchaUtil.generateCaptcha(captcha);
             Base64.Encoder encoder = Base64.getEncoder();
             String png_base64 = encoder.encodeToString(captchaImage);;//转换成base64串
             png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");
+            String uuid = UUID.randomUUID().toString();
+            redisUtil.set(uuid, captcha, 60L);
             return ApiResult.success("data:image/jpg;base64," + png_base64);
         } catch (IOException e) {
             e.printStackTrace();

+ 5 - 4
application/src/main/java/com/ctsi/utils/CaptchaUtil.java

@@ -1,6 +1,9 @@
 package com.ctsi.utils;
 
 
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+
+import javax.annotation.Resource;
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpSession;
 import java.awt.*;
@@ -14,7 +17,7 @@ public class CaptchaUtil {
     private static final int HEIGHT = 35;
     private static final int LENGTH = 4;
 
-    public static byte[] generateCaptcha(HttpSession session) throws IOException {
+    public static byte[] generateCaptcha(String captcha) throws IOException {
         BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
         Graphics g = image.getGraphics();
 
@@ -24,7 +27,6 @@ public class CaptchaUtil {
         g.setColor(Color.BLACK);
         g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
 
-        String captcha = generateRandomString();
         g.setFont(new Font("Arial", Font.PLAIN, 20));
         for (int i = 0; i < LENGTH; i++) {
             g.setColor(new Color(new Random().nextInt(255), new Random().nextInt(255), new Random().nextInt(255)));
@@ -44,11 +46,10 @@ public class CaptchaUtil {
 
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         ImageIO.write(image, "png", outputStream);
-        session.setAttribute("captcha", captcha);
         return outputStream.toByteArray();
     }
 
-    private static String generateRandomString() {
+    public static String generateRandomString() {
         String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
         StringBuilder stringBuilder = new StringBuilder();
         Random random = new Random();

+ 4 - 0
core/pom.xml

@@ -72,6 +72,10 @@
             <version>0.4</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-redis</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 357 - 0
core/src/main/java/com/ctsi/utils/RedisUtil.java

@@ -0,0 +1,357 @@
+package com.ctsi.utils;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.*;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * redis工具类
+ *
+ * @author lym
+ */
+@Component("redisUtil")
+public class RedisUtil {
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    private static double size = Math.pow(2, 32);
+
+
+    /**
+     * 写入缓存
+     *
+     * @param key
+     * @param offset 位 8Bit=1Byte
+     * @return
+     */
+    public boolean setBit(String key, long offset, boolean isShow) {
+        boolean result = false;
+        try {
+            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
+            operations.setBit(key, offset, isShow);
+            result = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 写入缓存
+     *
+     * @param key
+     * @param offset
+     * @return
+     */
+    public boolean getBit(String key, long offset) {
+        boolean result = false;
+        try {
+            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
+            result = operations.getBit(key, offset);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+
+    /**
+     * 写入缓存
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    public boolean set(final String key, Object value) {
+        boolean result = false;
+        try {
+            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
+            operations.set(key, value);
+            result = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 获取失效时间
+     *
+     * @param key
+     *            键
+     * @return 失效时间(秒)
+     */
+    public long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 写入缓存设置时效时间
+     *
+     * @param key
+     * @param value
+     * @return
+     */
+    public boolean set(final String key, Object value, Long expireTime) {
+        boolean result = false;
+        try {
+            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
+            operations.set(key, value);
+            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
+            result = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 批量删除对应的value
+     *
+     * @param keys
+     */
+    public void remove(final String... keys) {
+        for (String key : keys) {
+            remove(key);
+        }
+    }
+
+
+    /**
+     * 删除对应的value
+     *
+     * @param key
+     */
+    public void remove(final String key) {
+        if (exists(key)) {
+            redisTemplate.delete(key);
+        }
+    }
+
+    /**
+     * 判断缓存中是否有对应的value
+     *
+     * @param key
+     * @return
+     */
+    public boolean exists(final String key) {
+        return redisTemplate.hasKey(key);
+    }
+
+    /**
+     * 读取缓存
+     *
+     * @param key
+     * @return
+     */
+    public Object get(final String key) {
+        Object result = null;
+        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
+        result = operations.get(key);
+        return result;
+    }
+
+    /**
+     * 哈希 添加
+     *
+     * @param key
+     * @param hashKey
+     * @param value
+     */
+    public void hmSet(String key, Object hashKey, Object value) {
+        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
+        hash.put(key, hashKey, value);
+    }
+
+    /**
+     * 哈希获取数据
+     *
+     * @param key
+     * @param hashKey
+     * @return
+     */
+    public Object hmGet(String key, Object hashKey) {
+        HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
+        return hash.get(key, hashKey);
+    }
+
+    /**
+     * 列表添加
+     *
+     * @param k
+     * @param v
+     */
+    public void lPush(String k, Object v) {
+        ListOperations<String, Object> list = redisTemplate.opsForList();
+        list.rightPush(k, v);
+    }
+
+    /**
+     * 列表获取
+     *
+     * @param k
+     * @param l
+     * @param l1
+     * @return
+     */
+    public List<Object> lRange(String k, long l, long l1) {
+        ListOperations<String, Object> list = redisTemplate.opsForList();
+        return list.range(k, l, l1);
+    }
+
+    /**
+     * 集合添加
+     *
+     * @param key
+     * @param value
+     */
+    public void add(String key, Object value) {
+        SetOperations<String, Object> set = redisTemplate.opsForSet();
+        set.add(key, value);
+    }
+
+    /**
+     * 集合获取
+     *
+     * @param key
+     * @return
+     */
+    public Set<Object> setMembers(String key) {
+        SetOperations<String, Object> set = redisTemplate.opsForSet();
+        return set.members(key);
+    }
+
+    /**
+     * 有序集合添加
+     *
+     * @param key
+     * @param value
+     * @param scoure
+     */
+    public void zAdd(String key, Object value, double scoure) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        zset.add(key, value, scoure);
+    }
+
+    /**
+     * 有序集合获取
+     *
+     * @param key
+     * @param scoure
+     * @param scoure1
+     * @return
+     */
+    public Set<Object> rangeByScore(String key, double scoure, double scoure1) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        redisTemplate.opsForValue();
+        return zset.rangeByScore(key, scoure, scoure1);
+    }
+
+
+    //第一次加载的时候将数据加载到redis中
+    public void saveDataToRedis(String name) {
+        long indexLong = (long) Math.abs(name.hashCode() % size);
+        boolean availableUsers = setBit("availableUsers", indexLong, true);
+    }
+
+    //第一次加载的时候将数据加载到redis中
+    public boolean getDataToRedis(String name) {
+
+        long indexLong = (long) Math.abs(name.hashCode() % size);
+        return getBit("availableUsers", indexLong);
+    }
+
+    /**
+     * 有序集合获取排名
+     *
+     * @param key   集合名称
+     * @param value 值
+     */
+    public Long zRank(String key, Object value) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        return zset.rank(key, value);
+    }
+
+
+    /**
+     * 有序集合获取排名
+     *
+     * @param key
+     */
+    public Set<ZSetOperations.TypedTuple<Object>> zRankWithScore(String key, long start, long end) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        Set<ZSetOperations.TypedTuple<Object>> ret = zset.rangeWithScores(key, start, end);
+        return ret;
+    }
+
+    /**
+     * 有序集合添加
+     *
+     * @param key
+     * @param value
+     */
+    public Double zSetScore(String key, Object value) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        return zset.score(key, value);
+    }
+
+
+    /**
+     * 有序集合添加分数
+     *
+     * @param key
+     * @param value
+     * @param scoure
+     */
+    public void incrementScore(String key, Object value, double scoure) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        zset.incrementScore(key, value, scoure);
+    }
+
+
+    /**
+     * 有序集合获取排名
+     *
+     * @param key
+     */
+    public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithScore(String key, long start, long end) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeByScoreWithScores(key, start, end);
+        return ret;
+    }
+
+    /**
+     * 有序集合获取排名
+     *
+     * @param key
+     */
+    public Set<ZSetOperations.TypedTuple<Object>> reverseZRankWithRank(String key, long start, long end) {
+        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();
+        Set<ZSetOperations.TypedTuple<Object>> ret = zset.reverseRangeWithScores(key, start, end);
+        return ret;
+    }
+
+    public Long delete(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                if(redisTemplate.delete(key[0])) {
+                    return Long.valueOf(1);
+                }else {
+                    return Long.valueOf(0);
+                }
+            } else {
+                return redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+        return Long.valueOf(0);
+    }
+
+}
+