| New file | 
 |  |  | 
 |  |  | package com.dy.pipIrrApp.captcha; | 
 |  |  |  | 
 |  |  | import com.dy.common.multiDataSource.DataSourceContext; | 
 |  |  | import com.dy.common.webUtil.BaseResponse; | 
 |  |  | import com.dy.common.webUtil.BaseResponseUtils; | 
 |  |  | import com.dy.pipIrrApp.captcha.dto.CaptchaDomain; | 
 |  |  | import com.dy.pipIrrGlobal.pojoBa.BaCaptcha; | 
 |  |  | import jakarta.servlet.ServletOutputStream; | 
 |  |  | import jakarta.servlet.http.HttpServletRequest; | 
 |  |  | import jakarta.servlet.http.HttpServletResponse; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  |  | 
 |  |  | import javax.imageio.ImageIO; | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.util.Calendar; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * @author ZhuBaoMin | 
 |  |  |  * @date 2024-09-11 13:45 | 
 |  |  |  * @LastEditTime 2024-09-11 13:45 | 
 |  |  |  * @Description | 
 |  |  |  */ | 
 |  |  |  | 
 |  |  | @Slf4j | 
 |  |  | @RestController | 
 |  |  | @RequestMapping(path="captcha") | 
 |  |  | public class CaptchaCtrl { | 
 |  |  |     @Autowired | 
 |  |  |     private CaptchaSV captchaSV; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取验证码 | 
 |  |  |      * @param type,图片类型:char-文本,math-一位数算式,math2-两位数算式 | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/get") | 
 |  |  |     @ResponseBody | 
 |  |  |     public BaseResponse<CaptchaDomain> getCaptcha(HttpServletRequest request, @RequestParam(value = "type", required = false, defaultValue = "char") String type) { | 
 |  |  |         // 配置数据源 | 
 |  |  |         HttpServletRequest httpRequest = (HttpServletRequest) request; | 
 |  |  |         String wxDataSourceName = httpRequest.getHeader("tag"); | 
 |  |  |         if(wxDataSourceName != null && wxDataSourceName.trim().length() > 0){ | 
 |  |  |             log.info("微信开发,设置数据源名称为:" + wxDataSourceName); | 
 |  |  |             //把组织单位标签作为数据源名称 | 
 |  |  |             DataSourceContext.set(wxDataSourceName); | 
 |  |  |         } else { | 
 |  |  |             log.info("用户未选择数据源"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 生成验证码实体 | 
 |  |  |         CaptchaDomain captchaDomain = captchaSV.createGoogleCaptcha(type); | 
 |  |  |         if (null != captchaDomain) { | 
 |  |  |  | 
 |  |  |             // 验证码保存至redis | 
 |  |  |             // redisUtils.set(captchaDomain.getToken(), captchaDomain.getCode(), 300L); | 
 |  |  |  | 
 |  |  |             // 验证码保存至session | 
 |  |  |             //HttpSession session = (HttpSession) request.getSession(); | 
 |  |  |             //session.setAttribute(captchaDomain.getToken(), captchaDomain.getCode()); | 
 |  |  |  | 
 |  |  |             /** | 
 |  |  |              * 验证保存到数据库 | 
 |  |  |              * 获取当前时间戳并延后3分钟 | 
 |  |  |              */ | 
 |  |  |             Long timestamp = System.currentTimeMillis(); | 
 |  |  |             Calendar calendar = Calendar.getInstance(); | 
 |  |  |             calendar.setTimeInMillis(timestamp); | 
 |  |  |             calendar.add(Calendar.SECOND, 180); | 
 |  |  |  | 
 |  |  |             BaCaptcha baCaptcha = new BaCaptcha(); | 
 |  |  |             baCaptcha.setToken(captchaDomain.getToken()); | 
 |  |  |             baCaptcha.setCode(captchaDomain.getCode()); | 
 |  |  |             baCaptcha.setExpiration(calendar.getTimeInMillis()); | 
 |  |  |             Long rec = captchaSV.addCaptcha(baCaptcha); | 
 |  |  |             //System.out.println("token: " + captchaDomain.getToken() + "; code: " + captchaDomain.getCode()); | 
 |  |  |  | 
 |  |  |             // 无用信息设空 | 
 |  |  |             captchaDomain.setText(null); | 
 |  |  |             captchaDomain.setCode(null); | 
 |  |  |             // 返回前端信息 | 
 |  |  |             return BaseResponseUtils.buildSuccess(captchaDomain); | 
 |  |  |         } else { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 直接输出图片 | 
 |  |  |      * @param type,图片类型:char-文本,math-一位数算式,math2-两位数算式 | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/get/image") | 
 |  |  |     public void getCaptchaImage(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "type", required = false, defaultValue = "char") String type) { | 
 |  |  |         CaptchaDomain captchaDomain = null; | 
 |  |  |  | 
 |  |  |         // 生成谷歌验证码实体 | 
 |  |  |         captchaDomain = captchaSV.createGoogleCaptcha(type); | 
 |  |  |  | 
 |  |  |         // 验证码保存至redis | 
 |  |  |         // redisUtils.set(captchaDomain.getToken(), captchaDomain.getCode(), 300L); | 
 |  |  |  | 
 |  |  |         // 验证码保存至session | 
 |  |  |         //HttpSession session = (HttpSession) request.getSession(); | 
 |  |  |         //session.setAttribute(captchaDomain.getToken(), captchaDomain.getCode()); | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 验证保存到数据库 | 
 |  |  |          * 获取当前时间戳并延后3分钟 | 
 |  |  |          */ | 
 |  |  |         Long timestamp = System.currentTimeMillis(); | 
 |  |  |         Calendar calendar = Calendar.getInstance(); | 
 |  |  |         calendar.setTimeInMillis(timestamp); | 
 |  |  |         calendar.add(Calendar.SECOND, 180); | 
 |  |  |  | 
 |  |  |         BaCaptcha baCaptcha = new BaCaptcha(); | 
 |  |  |         baCaptcha.setToken(captchaDomain.getToken()); | 
 |  |  |         baCaptcha.setCode(captchaDomain.getCode()); | 
 |  |  |         baCaptcha.setExpiration(calendar.getTimeInMillis()); | 
 |  |  |         Long rec = captchaSV.addCaptcha(baCaptcha); | 
 |  |  |         //System.out.println("token: " + captchaDomain.getToken() + "; code: " + captchaDomain.getCode()); | 
 |  |  |  | 
 |  |  |         // 以文件流的形式,输出验证码图片 | 
 |  |  |         ServletOutputStream out = null; | 
 |  |  |         try { | 
 |  |  |             response.setContentType("image/jpeg"); | 
 |  |  |             out = response.getOutputStream(); | 
 |  |  |             ImageIO.write(captchaDomain.getImage(), "jpg", out); | 
 |  |  |             out.flush(); | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             e.printStackTrace(); | 
 |  |  |         } finally { | 
 |  |  |             try { | 
 |  |  |                 if (out != null) { | 
 |  |  |                     out.close(); | 
 |  |  |                 } | 
 |  |  |             } catch (IOException e) { | 
 |  |  |                 e.printStackTrace(); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |