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