滑动验证码的设计与理解(3)
其中init的方法,大家就可以抄啦,验证码是这里生成的(感谢网上一些热心网友提供的Mod,在此基础上改的)。
2|0后端的设计:
首先要有一个验证码的接口,将一些常量和共同的方法抽象到接口中(接口最重要的作用就是行为的统一,意思是我如果知道这个是验证码,那么必定就会有验证的方法,不管它是滑动验证,图形验证等,然后就可以放心的调用验证方法去获取验证结果,下面过滤器设计就可以立马看到这作用。具体java接口的说明会单独写篇文章),接口如下:
/**
* 验证码类的接口,所有验证码必须继承此接口
*/
public interface I_Identifying<T> {
String EXCEPTION_CODE = SystemStaticValue.IDENTIFYING_EXCEPTION_CODE;
String IDENTIFYING = "Identifying";
//--------------以下为验证码大体错误类型,抛出错误时候用,会传至前端---------------
//验证成功
String SUCCESS = "Success";
//验证失败
String FAILURE = "Failure";
//验证码过期
String OVERDUE = "Overdue";
//-------以下为验证码具体错误类型,存放在checkResult-------------
String PARAM_ERROR = "验证码参数错误";
String OVERDUE_ERROR = "验证码过期";
String TYPE_ERROR = "验证码业务类型错误";
String ID_ERROR = "验证码id异常";
String CHECK_ERROR = "验证码验证异常";
/**
* 获取生成好的验证码
* @param request
* @return
*/
public T getInstance(HttpServletRequest request) throws Exception;
/**
* 进行验证,没抛异常说明验证无误
* @return
*/
public void checkIdentifying(HttpServletRequest request) throws Exception;
/**
* 获取验证结果,如果成功则为success,失败则为失败信息
* @return
*/
public String getCheckResult();
/**
* 获取验证码的业务类型
* @return
*/
public String getIdentifyingType();
}
然后,设计一个具体的滑动验证类去实现这个接口,这里只贴参数:
/**
* @author NiceBin
* @description: 验证码类,前端需要生成验证码的信息
* @date 2019/7/12 16:04
*/
public class ImgIdentifying implements I_Identifying<ImgIdentifying>,Serializable {
//此次验证码的id
private String identifyingId;
//此次验证码的业务类型
private String identifyingType;
//需要使用的图片
private String imgSrc;
//生成块的x坐标
private int X;
//生成块的y坐标
private int Y;
//允许的误差
private int deviation = 2;
//验证码生成的时间
private Calendar calendar;
//验证码结果,如果有结果说明已经被校验,防止因为网络延时的二次校验
private String checkResult;
//下面是逻辑代码...
}
上面每个变量都是一种校验手段,如calendar可以检验验证码是否过期,identifyingType检验此验证码是否是对应的业务等。每多想一点,别人破解就多费劲一点。
