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