SmsValidateCodeProcessor.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. *
  3. */
  4. package com.yihu.base.security.sms.process;
  5. import com.fasterxml.jackson.databind.util.JSONPObject;
  6. import com.yihu.base.security.properties.SecurityProperties;
  7. import com.yihu.base.security.sms.exception.ValidateCodeException;
  8. import com.yihu.base.security.sms.generator.SmsValidateCodeGenerator;
  9. import com.yihu.base.security.sms.generator.ValidateCodeGenerator;
  10. import com.yihu.base.security.sms.sender.SmsCodeSender;
  11. import com.yihu.base.security.sms.vo.ValidateCode;
  12. import net.sf.json.JSONObject;
  13. import org.apache.commons.lang.StringUtils;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.data.redis.core.StringRedisTemplate;
  16. import org.springframework.stereotype.Component;
  17. import org.springframework.web.bind.ServletRequestBindingException;
  18. import org.springframework.web.bind.ServletRequestUtils;
  19. import org.springframework.web.context.request.ServletWebRequest;
  20. import java.util.Map;
  21. /**
  22. * @author chenweida
  23. */
  24. @Component
  25. public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
  26. @Autowired
  27. private StringRedisTemplate redisTemplate;
  28. @Autowired
  29. private SmsCodeSender smsCodeSender;
  30. @Autowired
  31. private SmsValidateCodeGenerator smsValidateCodeGenerator;
  32. /*
  33. * (non-Javadoc)
  34. *
  35. * @see
  36. * com.imooc.security.core.validate.code.ValidateCodeProcessor#create(org.
  37. * springframework.web.context.request.ServletWebRequest)
  38. */
  39. @Override
  40. public void create(ServletWebRequest request) throws Exception {
  41. ValidateCode validateCode = generate(request);
  42. save(request, validateCode);
  43. send(request, validateCode);
  44. }
  45. /**
  46. * 生成校验码
  47. *
  48. * @param request
  49. * @return
  50. */
  51. @SuppressWarnings("unchecked")
  52. private ValidateCode generate(ServletWebRequest request) {
  53. return smsValidateCodeGenerator.generate(request);
  54. }
  55. /**
  56. * 保存校验码
  57. *
  58. * @param request
  59. * @param validateCode
  60. */
  61. private void save(ServletWebRequest request, ValidateCode validateCode) {
  62. JSONObject jo = new JSONObject();
  63. jo.put("code", validateCode.getCode());
  64. jo.put("expireTime", validateCode.getExpireTimeString());
  65. redisTemplate.opsForValue().set(key(request), jo.toString());
  66. }
  67. /**
  68. * 删除严验证码
  69. *
  70. * @param request
  71. */
  72. private void reomve(ServletWebRequest request) {
  73. redisTemplate.delete((key(request)));
  74. }
  75. /**
  76. * 获取校验码
  77. *
  78. * @param request
  79. */
  80. private ValidateCode get(ServletWebRequest request) {
  81. String joStr = redisTemplate.opsForValue().get(key(request));
  82. if (StringUtils.isNotBlank(joStr)) {
  83. JSONObject jo = JSONObject.fromObject(joStr);
  84. ValidateCode validateCode = new ValidateCode();
  85. validateCode.setCode(jo.getString("code"));
  86. validateCode.setExpireTimeString(jo.getString("expireTime"));
  87. return validateCode;
  88. } else {
  89. return null;
  90. }
  91. }
  92. /**
  93. * 拼凑放在redis的key
  94. *
  95. * @param request
  96. * @return
  97. */
  98. private String key(ServletWebRequest request) {
  99. return SecurityProperties.prefix_sms + request.getParameter(SecurityProperties.mobileLoginAccountKey);
  100. }
  101. /**
  102. * 发送校验码,由子类实现
  103. *
  104. * @param request
  105. * @param validateCode
  106. * @throws Exception
  107. */
  108. protected void send(ServletWebRequest request, ValidateCode validateCode) throws Exception {
  109. smsCodeSender.send(request.getParameter(SecurityProperties.mobileLoginAccountKey), validateCode.getCode());
  110. }
  111. @SuppressWarnings("unchecked")
  112. @Override
  113. public void validate(ServletWebRequest request) {
  114. String sessionKey = key(request);
  115. //获取验证码
  116. ValidateCode validateCode = get(request);
  117. String codeInRequest;
  118. //获取请求中的验证码
  119. try {
  120. codeInRequest = ServletRequestUtils.getStringParameter(request.getRequest(),
  121. SecurityProperties.mobileSendSms);
  122. } catch (ServletRequestBindingException e) {
  123. throw new ValidateCodeException("获取验证码的值失败");
  124. }
  125. if (StringUtils.isBlank(codeInRequest)) {
  126. throw new ValidateCodeException("验证码的值不能为空");
  127. }
  128. if (validateCode == null) {
  129. throw new ValidateCodeException("验证码不存在");
  130. }
  131. if (validateCode.isExpried()) {
  132. reomve(request);
  133. throw new ValidateCodeException("验证码已过期");
  134. }
  135. if (!StringUtils.equals(validateCode.getCode(), codeInRequest)) {
  136. throw new ValidateCodeException("验证码不匹配");
  137. }
  138. //验证成功删除验证码
  139. reomve(request);
  140. }
  141. }