zhubaomin
2025-04-17 1e3eeec2d3a470d066d21900586b912dfef58c91
pipIrr-platform/pipIrr-web/pipIrr-web-app/src/main/java/com/dy/pipIrrApp/captcha/CaptchaCtrl.java
New file
@@ -0,0 +1,143 @@
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();
            }
        }
    }
}