123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package com.yihu.wlyy.web.common.util;
- import com.google.code.kaptcha.impl.DefaultKaptcha;
- import com.google.code.kaptcha.util.Config;
- import com.yihu.wlyy.web.BaseController;
- import io.swagger.annotations.Api;
- import io.swagger.annotations.ApiOperation;
- import org.springframework.http.MediaType;
- import org.springframework.web.bind.annotation.*;
- import sun.misc.BASE64Encoder;
- import javax.imageio.ImageIO;
- import java.awt.image.BufferedImage;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.Properties;
- import java.util.UUID;
- import java.util.concurrent.ConcurrentHashMap;
- /**
- * 患者端验证码生成控制器。验证码生成后保存到Redis中,并将Redis的Key与图片路径返回。
- * 客户端获取图片,并由用户输入后,与redis的key一块返回,用于验证是否出错。
- *
- * @author Sand
- * @created 2016/09/28
- */
- @Api(description = "验证码")
- @RestController
- @RequestMapping(value = "/patient/captcha", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
- public class CaptchaController extends BaseController {
- private Map<String, String> captchaCache = new ConcurrentHashMap<>();
- private DefaultKaptcha captchaProducer = new DefaultKaptcha();
- public CaptchaController() {
- Properties properties = new Properties();
- properties.put("kaptcha.textproducer.font.color", "blue");
- properties.put("kaptcha.textproducer.font.size", "45");
- properties.put("kaptcha.textproducer.char.length", "4");
- properties.put("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
- Config config = new Config(properties);
- captchaProducer.setConfig(config);
- }
- @RequestMapping(method = RequestMethod.GET)
- @ApiOperation("生成验证码,用于第一次请求")
- public String createCaptcha(){
- try{
- return generateCaptcha();
- } catch (Exception e){
- return error(500, e.getMessage());
- }
- }
- @RequestMapping(value = "/{legacy_key}", method = RequestMethod.POST)
- @ApiOperation("刷新验证码,需提供第一次生成验证码返回的key")
- public String refreshCaptcha(@PathVariable("legacy_key") String legacyKey){
- try{
- cleanCaptcha(legacyKey);
- return generateCaptcha();
- } catch (Exception e){
- return error(500, e.getMessage());
- }
- }
- @RequestMapping(value = "/{key}", method = RequestMethod.GET)
- @ApiOperation("校验证码,提供key及用户输入的验证码")
- public String verifyCaptcha(@PathVariable("key") String key,
- @RequestParam("text") String text){
- try{
- boolean pass = false;
- String captcha = captchaCache.get(key);
- if (captcha != null && captcha.equals(text)){
- pass = true;
- cleanCaptcha(key);
- }
- return write(200, "ok", "pass", pass);
- } catch (Exception e){
- return error(500, e.getMessage());
- }
- }
- private String generateCaptcha() throws IOException {
- String captchaText = captchaProducer.createText();
- BufferedImage image = captchaProducer.createImage(captchaText);
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- ImageIO.write(image, "png", outputStream);
- String base64Img = new BASE64Encoder().encode(outputStream.toByteArray());
- String key = "captcha:" + UUID.randomUUID().toString() + ":text";
- Map<String, String> data = new HashMap<>();
- data.put("key", key);
- data.put("image", base64Img);
- data.put("format", "png");
- captchaCache.put(key, captchaText);
- return write(200, "ok", "data", data);
- }
- private void cleanCaptcha(String key){
- captchaCache.remove(key);
- }
- }
|