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