SmsCodeController.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package com.ym.mec.student.controller;
  2. import com.google.code.kaptcha.Constants;
  3. import com.google.code.kaptcha.Producer;
  4. import com.google.code.kaptcha.servlet.KaptchaServlet;
  5. import com.ym.mec.biz.service.SmsCodeService;
  6. import com.ym.mec.common.controller.BaseController;
  7. import com.ym.mec.common.security.SecurityConstants;
  8. import io.swagger.annotations.Api;
  9. import io.swagger.annotations.ApiImplicitParam;
  10. import io.swagger.annotations.ApiImplicitParams;
  11. import io.swagger.annotations.ApiOperation;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.data.redis.core.RedisTemplate;
  15. import org.springframework.web.bind.annotation.GetMapping;
  16. import org.springframework.web.bind.annotation.PostMapping;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RestController;
  19. import javax.imageio.ImageIO;
  20. import javax.servlet.ServletOutputStream;
  21. import javax.servlet.http.HttpServletResponse;
  22. import java.awt.image.BufferedImage;
  23. import java.util.concurrent.TimeUnit;
  24. @RestController
  25. @RequestMapping("code")
  26. @Api(tags = "验证码服务")
  27. public class SmsCodeController extends BaseController {
  28. @Autowired
  29. private SmsCodeService smsCodeService;
  30. @Autowired
  31. private Producer captchaProducer;
  32. @Autowired
  33. private RedisTemplate<String,String> redisTemplate;
  34. @ApiOperation(value = "发送登录短信验证码")
  35. @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String")
  36. @PostMapping(value = "/sendSms")
  37. public Object sendLoginVerifyCode(String mobile) throws Exception {
  38. smsCodeService.sendValidCode(mobile);
  39. return succeed();
  40. }
  41. @ApiOperation(value = "校验短信验证码")
  42. @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
  43. @ApiImplicitParam(name = "code", value = "短信验证码", required = true, dataType = "String") })
  44. @PostMapping(value = "/verifySmsCode")
  45. public Object verifySmsCode(String phone,String code) {
  46. if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
  47. return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
  48. }
  49. if(smsCodeService.verifyValidCode(phone,code)){
  50. return succeed();
  51. }
  52. return failed();
  53. }
  54. @PostMapping(value = "/verifyLoginImage")
  55. @ApiOperation("校验登录图形验证码")
  56. @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
  57. @ApiImplicitParam(name = "code", value = "验证码", required = true, dataType = "String") })
  58. public Object verifyImageCode(String phone,String code){
  59. if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
  60. return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
  61. }
  62. String redisKey = Constants.KAPTCHA_SESSION_KEY + phone;
  63. if(redisTemplate.hasKey(redisKey)){
  64. if(StringUtils.equals(redisTemplate.opsForValue().get(redisKey),code)){
  65. return succeed();
  66. }
  67. }
  68. return failed(SecurityConstants.VERIFY_FAILURE);
  69. }
  70. @GetMapping(value = "/getLoginImage")
  71. @ApiOperation("获取登录图片验证码")
  72. @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String")
  73. public void getKaptchaImage(HttpServletResponse response,String phone) throws Exception {
  74. if(StringUtils.isEmpty(phone)){
  75. return;
  76. }
  77. response.setDateHeader("Expires", 0);
  78. // Set standard HTTP/1.1 no-cache headers.
  79. response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
  80. // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
  81. response.addHeader("Cache-Control", "post-check=0, pre-check=0");
  82. // Set standard HTTP/1.0 no-cache header.
  83. response.setHeader("Pragma", "no-cache");
  84. // return a jpeg
  85. response.setContentType("image/jpeg");
  86. // create the text for the image
  87. String capText = captchaProducer.createText();
  88. redisTemplate.opsForValue().set(Constants.KAPTCHA_SESSION_KEY + phone,capText,3, TimeUnit.MINUTES);
  89. // create the image with the text
  90. BufferedImage bi = captchaProducer.createImage(capText);
  91. KaptchaServlet kaptchaServlet = new KaptchaServlet();
  92. kaptchaServlet.init();
  93. ServletOutputStream out = response.getOutputStream();
  94. // write the data out
  95. ImageIO.write(bi, "jpg", out);
  96. try {
  97. out.flush();
  98. } finally {
  99. out.close();
  100. }
  101. }
  102. }