| 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|