소스 검색

验证码返回格式调整

chengyao 3 년 전
부모
커밋
e1ca8836f8

+ 0 - 25
src/main/java/com/diagbot/dto/ImageCaptchaDTO.java

@@ -1,25 +0,0 @@
-package com.diagbot.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-/**
- * @Author chengyao
- * @Date 2021/10/14 20:01
- * @Version 1.0
- */
-
-@Data
-@AllArgsConstructor
-public class ImageCaptchaDTO {
-    /**
-     * 图片验证码文字内容
-     */
-    private String words;
-    /**
-     * 返回内容,例如正常的Base64或以Web的image标签识别的base64格式
-     */
-    private String returnContent;
-    //图片唯一id
-    private String captchaId;
-}

+ 60 - 44
src/main/java/com/diagbot/facade/SysUserFacade.java

@@ -46,6 +46,13 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.DigestUtils;
 import org.springframework.util.StringUtils;
 
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -96,9 +103,9 @@ public class SysUserFacade extends SysUserServiceImpl {
     private RedisUtils redisUtils;
 
 
-
     /**
      * 获取标识--选择登录页面
+     *
      * @return java.lang.Long
      */
     public Long getHospitalMark() {
@@ -107,30 +114,39 @@ public class SysUserFacade extends SysUserServiceImpl {
                 .eq(SysHospitalSet::getHospitalId, 35)
                 .eq(SysHospitalSet::getIsDeleted, IsDeleteEnum.N.getKey())
                 .eq(SysHospitalSet::getCode, "special_page_csxy").one();
-        if(null != sysHospitalSet){
+        if (null != sysHospitalSet) {
             String val = sysHospitalSet.getValue();
-            if(StringUtil.isNotBlank(val) && "1".equals(val)){
-               mark =  Long.valueOf(val);
+            if (StringUtil.isNotBlank(val) && "1".equals(val)) {
+                mark = Long.valueOf(val);
             }
         }
         return mark;
     }
 
-    public ImageCaptchaDTO getCaptcha() throws IOException {
-        ImageCaptchaDTO base64ForWeb = ImageCaptchaUtil.createBase64ForWeb(new ImageCaptchaParams());
-        String key = UUID.randomUUID().toString();
-        base64ForWeb.setCaptchaId(key);
-        redisUtils.set(key, base64ForWeb.getWords(), 60*2);
-        return base64ForWeb;
-    };
+    public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
+        HttpSession session = request.getSession();
+        String captchaId = session.getId();
+        session.setAttribute("captchaId", captchaId);
+        ServletOutputStream outputStream = response.getOutputStream();
+        ImageCaptchaUtil imageCaptchaUtil = new ImageCaptchaUtil();
+        BufferedImage image = imageCaptchaUtil.createRandom();
+        String captcha = imageCaptchaUtil.getText();
+        ImageIO.write(image, ImageCaptchaParams.DEFAULT_FORMAT, outputStream);
+        outputStream.flush();
+        outputStream.close();
+        redisUtils.set("user:captcha" + captchaId, captcha, 60 * 3);
+    }
+
+    ;
 
     /**
      * 获取jwt
+     *
      * @param username 用户名
      * @param password 密码
      * @return jwt
      */
-    public JwtDTO getJwt(String username, String password, String captcha, String captchaId) {
+    public JwtDTO getJwt(HttpServletRequest request, String username, String password, String captcha) {
         JwtDTO data = new JwtDTO();
         if (StringUtil.isBlank(username)) {
             throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
@@ -140,17 +156,17 @@ public class SysUserFacade extends SysUserServiceImpl {
             throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
                     "请输入密码");
         }
-     /*   if (StringUtils.isEmpty(captcha)) {
+        if (StringUtils.isEmpty(captcha)) {
             throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
                     "请输入验证码");
         }
         // 验证码校验
-        Object captchaObject= redisUtils.get(captchaId);
-        redisUtils.del(captchaId);
-        if(null == captchaObject || StringUtils.isEmpty(captchaObject.toString()) || !captchaObject.toString().trim().equalsIgnoreCase(captcha)){
-                throw new CommonException(CommonErrorCode.PARAM_IS_ERROR,"验证码错误");
-            }
-*/
+        String captchaId = request.getSession().getId();
+        Object captchaObject = redisUtils.get("user:captcha" + captchaId);
+        redisUtils.del("user:captcha" + captchaId);
+        if (null == captchaObject || StringUtils.isEmpty(captchaObject.toString()) || !captchaObject.toString().trim().equalsIgnoreCase(captcha)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "验证码错误");
+        }
         //使用MD5对密码进行加密
         String MD5Password = DigestUtils.md5DigestAsHex(password.getBytes());
         QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
@@ -178,15 +194,12 @@ public class SysUserFacade extends SysUserServiceImpl {
         try {
             SysUserBaseVO sysUserBaseVO = new SysUserBaseVO();
             sysUserBaseVO.setUserId(user.getId());
-            List<SysRoleDTO> selRoles =getlocalUserRoles(sysUserBaseVO);
-            if(selRoles!=null&&!selRoles.isEmpty())
-            {
+            List<SysRoleDTO> selRoles = getlocalUserRoles(sysUserBaseVO);
+            if (selRoles != null && !selRoles.isEmpty()) {
                 data.setSelRoles(selRoles);
             }
 
-        }
-        catch (Exception e)
-        {
+        } catch (Exception e) {
             e.printStackTrace();
         }
         //token存入redis
@@ -197,8 +210,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         /***
          * 未经过MD5加密密码复杂度判断
          */
-     //   获取用户医院id
-   //     String hospitalID = SysUserUtils.getCurrentHospitalID();
+        //   获取用户医院id
+        //     String hospitalID = SysUserUtils.getCurrentHospitalID();
         Long id = user.getId();
         QueryWrapper<SysUserHospital> UserHospitalQueryWrapper = new QueryWrapper<>();
         UserHospitalQueryWrapper
@@ -207,8 +220,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         SysUserHospital userHospital = sysUserHospitalFacade.getOne(UserHospitalQueryWrapper, false);
         Long hospitalId = userHospital.getHospitalId();
         String idStr = String.valueOf(hospitalId);
-        Boolean passwordRegular = passwordRegular(password,idStr);
-        if(!passwordRegular){
+        Boolean passwordRegular = passwordRegular(password, idStr);
+        if (!passwordRegular) {
             data.setPasswordComplexity("未修改初始密码,请及时修改密码");
         }
         return data;
@@ -320,8 +333,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         }
         //对传入的密码进行格式验证
         String hospitalID = SysUserUtils.getCurrentHospitalID();
-        Boolean regularBoolean = passwordRegular(modifyPassword,hospitalID);
-        if(!regularBoolean){
+        Boolean regularBoolean = passwordRegular(modifyPassword, hospitalID);
+        if (!regularBoolean) {
             throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "请输入正确格式的新密码");
         }
         String userId = SysUserUtils.getCurrentPrincipleID();
@@ -351,23 +364,25 @@ public class SysUserFacade extends SysUserServiceImpl {
 
     /**
      * 未加密密文正则表达式  至少8个字符,1个大写字母,1个小写字母,1个数字和1个特殊字符:
+     *
      * @param password
      * @return
      */
-    public Boolean passwordRegular(String password,String hospitalId){
-        boolean check=true;
+    public Boolean passwordRegular(String password, String hospitalId) {
+        boolean check = true;
         Map<String, Map<String, String>> dictionaryWithKey = sysDictionaryFacade.getDictionaryWithKey();
-        if(dictionaryWithKey!=null){
+        if (dictionaryWithKey != null) {
             Map<String, String> stringStringMap = dictionaryWithKey.get("30");
-            if(stringStringMap!=null) {
+            if (stringStringMap != null) {
                 String regular = stringStringMap.get(hospitalId);
-                if(StringUtil.isNotEmpty(regular)) {
+                if (StringUtil.isNotEmpty(regular)) {
                     check = password.matches(regular);
                 }
             }
         }
         return check;
     }
+
     /**
      * 登录
      *
@@ -382,13 +397,13 @@ public class SysUserFacade extends SysUserServiceImpl {
                 .eq("status", StatusEnum.Enable.getKey())
                 .eq("id", userId), false);
         QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
-        sysUserRoleQueryWrapper.eq("user_id",userId);
-        sysUserRoleQueryWrapper .eq("is_deleted", IsDeleteEnum.N.getKey());
+        sysUserRoleQueryWrapper.eq("user_id", userId);
+        sysUserRoleQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey());
         List<SysUserRole> sysUserRoleList = sysUserRoleFacade.list(sysUserRoleQueryWrapper);
-        if(ListUtil.isNotEmpty(sysUserRoleList)){
-            sysUserRoleList.forEach(sysUserRole ->{
-                roleSet.add(sysUserRole.getRoleId()+"");
-            } );
+        if (ListUtil.isNotEmpty(sysUserRoleList)) {
+            sysUserRoleList.forEach(sysUserRole -> {
+                roleSet.add(sysUserRole.getRoleId() + "");
+            });
         }
         if (user == null) {
             throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
@@ -411,8 +426,8 @@ public class SysUserFacade extends SysUserServiceImpl {
         }
 
         //添加菜单信息
-        List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId(),roleSet);
-        List<SysUserPermissionDTO> sysUserPermissionDTOList = sysMenuFacade.getByRolePermission(user.getId(),roleSet);
+        List<SysMenuWrapper> menuList = sysMenuFacade.getByRole(user.getId(), roleSet);
+        List<SysUserPermissionDTO> sysUserPermissionDTOList = sysMenuFacade.getByRolePermission(user.getId(), roleSet);
         Map<Long, List<SysMenuWrapper>> menuMap = EntityUtil.makeEntityListMap(menuList, "parentId");
         Map<Long, List<SysUserPermissionDTO>> menuPermissionMap = EntityUtil.makeEntityListMap(sysUserPermissionDTOList, "menuId");
         List<SysMenuWrapper> menuRes = menuMap.get(-1L);
@@ -568,6 +583,7 @@ public class SysUserFacade extends SysUserServiceImpl {
 
         return sysUserRoleDTO;
     }
+
     /**
      * 获取用户角色
      *

+ 16 - 33
src/main/java/com/diagbot/util/ImageCaptchaUtil.java

@@ -1,36 +1,33 @@
 package com.diagbot.util;
 
-import cn.hutool.core.codec.Base64;
-import com.diagbot.dto.ImageCaptchaDTO;
 import com.diagbot.entity.ImageCaptchaParams;
 import org.patchca.color.SingleColorFactory;
 import org.patchca.filter.predefined.CurvesRippleFilterFactory;
 import org.patchca.font.RandomFontFactory;
+import org.patchca.service.Captcha;
 import org.patchca.service.ConfigurableCaptchaService;
-import org.patchca.utils.encoder.EncoderHelper;
 import org.patchca.word.RandomWordFactory;
 
 import java.awt.*;
-import java.io.ByteArrayOutputStream;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
-import java.io.OutputStream;
 
 /**
  * @author huangrusheng
  * @version 1.0
  * @date 2021/5/20 9:54
  */
-public final class ImageCaptchaUtil {
+public class ImageCaptchaUtil {
+    private String text;
 
-    private ImageCaptchaUtil(){}
     /**
-     * 流方式输出
-     * @param params
-     * @param outputStream
-     * @return 图片文字内容
+     * 以Web的img识别的base64返回
+     * @param
+     * @return 图片文字内容+base64格式的img标签识别的图片
      * @throws IOException
      */
-    public static String create(ImageCaptchaParams params, OutputStream outputStream) throws IOException{
+    public BufferedImage createRandom() throws IOException{
+        ImageCaptchaParams params = new ImageCaptchaParams();
         ConfigurableCaptchaService  captchaService = new ConfigurableCaptchaService();
         captchaService.setColorFactory(new SingleColorFactory(Color.black));
         CurvesRippleFilterFactory curvesRippleFilterFactory = new CurvesRippleFilterFactory();
@@ -49,29 +46,15 @@ public final class ImageCaptchaUtil {
         fontFactory.setMaxSize(params.getMaxFontSize());
         fontFactory.setMinSize(params.getMinFontSize());
         captchaService.setFontFactory(fontFactory);
-        return EncoderHelper.getChallangeAndWriteImage(captchaService,params.getFormat(),outputStream);
-    }
-    /**
-     * 以base64方式返回
-     * @param params
-     * @return 图片文字内容+base64格式的图片
-     * @throws IOException
-     */
-    public static ImageCaptchaDTO createBase64(ImageCaptchaParams params) throws IOException{
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024 * 3);
-        String words = create(params,outputStream);
-        return new ImageCaptchaDTO(words, Base64.encode(outputStream.toByteArray()),"");
+        Captcha captcha = captchaService.getCaptcha();
+        this.text = captcha.getChallenge();
+        return captcha.getImage();
     }
+
     /**
-     * 以Web的img识别的base64返回
-     * @param params
-     * @return 图片文字内容+base64格式的img标签识别的图片
-     * @throws IOException
+     * 获取验证码文本的方法
      */
-    public static ImageCaptchaDTO createBase64ForWeb(ImageCaptchaParams params) throws IOException{
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024 * 3);
-        String words = create(params,outputStream);
-        String encode = Base64.encode(outputStream.toByteArray());
-        return new ImageCaptchaDTO(words,encode,"");
+    public String getText() {
+        return text;
     }
 }

+ 1 - 3
src/main/java/com/diagbot/vo/UserLoginVO.java

@@ -18,8 +18,6 @@ public class UserLoginVO {
     private String username;
     @NotBlank(message = "请输入密码!")
     private String password;
-   // @NotBlank(message = "请输入验证码!")
+    @NotBlank(message = "请输入验证码!")
     private String captcha;
-    private String captchaId;
-
 }

+ 7 - 5
src/main/java/com/diagbot/web/SysUserController.java

@@ -2,7 +2,6 @@ package com.diagbot.web;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
-import com.diagbot.dto.ImageCaptchaDTO;
 import com.diagbot.dto.JwtDTO;
 import com.diagbot.dto.LoginDTO;
 import com.diagbot.dto.ModifyPasswordVO;
@@ -30,6 +29,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 
@@ -66,16 +68,16 @@ public class SysUserController {
                     "password:密码, 必填, 默认密码:a123456<br> ")
     @PostMapping("/getJwt")
     @SysLogger("getJwt")
-    public RespDTO<JwtDTO> getJwt(@RequestBody @Valid UserLoginVO userLoginVO) {
-        JwtDTO data = userFacade.getJwt(userLoginVO.getUsername(), userLoginVO.getPassword(),userLoginVO.getCaptcha(),userLoginVO.getCaptchaId());
+    public RespDTO<JwtDTO> getJwt(HttpServletRequest request,@RequestBody @Valid UserLoginVO userLoginVO) {
+        JwtDTO data = userFacade.getJwt(request,userLoginVO.getUsername(), userLoginVO.getPassword(),userLoginVO.getCaptcha());
         return RespDTO.onSuc(data);
     }
 
     @ApiOperation(value = "获取验证码[by:cy]")
     @PostMapping("/getCaptcha")
     @SysLogger("getCaptcha")
-    public RespDTO<ImageCaptchaDTO> getCaptcha() throws IOException {
-        return  RespDTO.onSuc(userFacade.getCaptcha());
+    public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
+          userFacade.getCaptcha(request,response);
     }
 
     @ApiOperation(value = "获取标识--选择登录页面[by:cy]")