SmsValidateCodeProcessor.java 4.7 KB

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