之前是将验证码存放在session中的,若如要开发app,是没有session的,因此要改造验证码的相关的代码。
/**
* 校验码处理器,封装不同校验码的处理逻辑
*
* @author zhailiang
*
*/
public interface ValidateCodeProcessor {
/**
* 创建校验码
*
* @param request
* @throws Exception
*/
void create(ServletWebRequest request) throws Exception;
/**
* 校验验证码
*
* @param servletWebRequest
* @throws Exception
*/
void validate(ServletWebRequest servletWebRequest);
}
/**
* 保存验证码的接口
* @author zhailiang
*
*/
public interface ValidateCodeRepository {
/**
* 保存验证码
* @param request
* @param code
* @param validateCodeType
*/
void save(ServletWebRequest request, ValidateCode code, ValidateCodeType validateCodeType);
/**
* 获取验证码
* @param request
* @param validateCodeType
* @return
*/
ValidateCode get(ServletWebRequest request, ValidateCodeType validateCodeType);
/**
* 移除验证码
* @param request
* @param codeType
*/
void remove(ServletWebRequest request, ValidateCodeType codeType);
}
具体的实现类:
/**
* 将验证码存放redis的类
* @author zhailiang
*
*/
@Component
public class RedisValidateCodeRepository implements ValidateCodeRepository {
@Autowired
private RedisTemplate<Object, Object> redisTemplate;
/**
* redis保存验证码
*/
@Override
public void save(ServletWebRequest request, ValidateCode code, ValidateCodeType type) {
redisTemplate.opsForValue().set(buildKey(request, type), code, 30, TimeUnit.MINUTES);
}
/**
* 获取redis中的验证码
*/
@Override
public ValidateCode get(ServletWebRequest request, ValidateCodeType type) {
Object value = redisTemplate.opsForValue().get(buildKey(request, type));
if (value == null) {
return null;
}
return (ValidateCode) value;
}
/**
* 删除redis中的验证码
*/
@Override
public void remove(ServletWebRequest request, ValidateCodeType type) {
redisTemplate.delete(buildKey(request, type));
}
/**
* 构建保存在redis中的key
* @param request
* @param type
* @return
*/
private String buildKey(ServletWebRequest request, ValidateCodeType type) {
String deviceId = request.getHeader("deviceId");
if (StringUtils.isBlank(deviceId)) {
throw new ValidateCodeException("请在请求头中携带deviceId参数");
}
return "code:" + type.toString().toLowerCase() + ":" + deviceId;
}
}
在alidateCodeProcessor 的抽象的实现:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -H "deviceId: 007" -H "Authorization: Basic aW1vb2M6aW1vb2NzZWNyZXQ=" -H "Cache-Control: no-cache" -H "Postman-Token: d6379b88-3a57-aa07-e9b7-133657b03ca6" -d "mobile=17317114089" -d "smsCode=12345" "http://localhost/authentication/mobile"