SmsValidateCodeProcessor.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. * 生成验证码
  34. */
  35. @Override
  36. public void create(ServletWebRequest request) throws Exception {
  37. //生成校验码
  38. ValidateCode validateCode = generate(request);
  39. //保存校验码
  40. save(request, validateCode);
  41. //发送校验码到手机号
  42. send(request, validateCode);
  43. }
  44. /**
  45. * 生成校验码
  46. *
  47. * @param request
  48. * @return
  49. */
  50. @SuppressWarnings("unchecked")
  51. public ValidateCode generate(ServletWebRequest request) {
  52. return smsValidateCodeGenerator.generate(request);
  53. }
  54. /**
  55. * 保存校验码
  56. *
  57. * @param request
  58. * @param validateCode
  59. */
  60. public void save(ServletWebRequest request, ValidateCode validateCode) {
  61. JSONObject jo = new JSONObject();
  62. jo.put("code", validateCode.getCode());//保存验证码
  63. jo.put("expireTime", validateCode.getExpireTimeString()); //保存超时时间
  64. jo.put("createTime", validateCode.getCreateTimeString()); //保存超时时间
  65. redisTemplate.opsForValue().set(key(request), jo.toString());
  66. }
  67. /**
  68. * 删除严验证码
  69. *
  70. * @param request
  71. */
  72. public 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. validateCode.setCreateTimeString(jo.getString("createTime"));
  88. return validateCode;
  89. } else {
  90. return null;
  91. }
  92. }
  93. /**
  94. * 拼凑放在redis的key 格式 security:oauth2:smsLogin:{手机号}
  95. *
  96. * @param request
  97. * @return
  98. */
  99. private String key(ServletWebRequest request) {
  100. return SecurityProperties.prefix_sms + request.getParameter(SecurityProperties.mobileLoginAccountKey);
  101. }
  102. /**
  103. * 发送校验码,由子类实现
  104. *
  105. * @param request
  106. * @param validateCode
  107. * @throws Exception
  108. */
  109. protected void send(ServletWebRequest request, ValidateCode validateCode) throws Exception {
  110. smsCodeSender.send(request.getParameter(SecurityProperties.mobileLoginAccountKey), validateCode.getCode());
  111. }
  112. @SuppressWarnings("unchecked")
  113. @Override
  114. public void validate(ServletWebRequest request) {
  115. //获取验证码
  116. ValidateCode validateCode = get(request);
  117. if (validateCode == null) {
  118. throw new ValidateCodeException("验证码不存在");
  119. }
  120. String codeInRequest;
  121. //获取请求中的验证码
  122. try {
  123. codeInRequest = ServletRequestUtils.getStringParameter(request.getRequest(),
  124. SecurityProperties.mobileLoginSmsKey);
  125. } catch (ServletRequestBindingException e) {
  126. throw new ValidateCodeException("获取验证码的值失败");
  127. }
  128. if (StringUtils.isBlank(codeInRequest)) {
  129. throw new ValidateCodeException("验证码的值不能为空");
  130. }
  131. if (validateCode.isExpried()) {
  132. throw new ValidateCodeException("验证码已过期");
  133. }
  134. if (!StringUtils.equals(validateCode.getCode(), codeInRequest)) {
  135. throw new ValidateCodeException("验证码不匹配");
  136. }
  137. }
  138. }