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