滑动验证码的设计与理解(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检验此验证码是否是对应的业务等。每多想一点,别人破解就多费劲一点。