1.服务器端防表单重复提交:
为每个表单设置一个令牌token,通过session存放在服务器端,并发给用户。当用户第一次带着令牌来的时候,允许提交,并且之后将服务器端的表单令牌即session中的token删除。
下一次用户重复提交表单时,没有表单了,则无法提交。
其中用到2个新算法:
(1) 指纹算法
String token = System.currentTimeMills() + new Randow().nextInt() + "";
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(token.getBytes());
因为一个随机数可能是任意位数的数,我们需要将这些随机数统一位数。所以采取指纹算法,得到它们的数据摘要,这样就保证了位数一致。
(2)base64 编码
BASE64Encoder encoder = new BASE64Encoder();
String str = encoder.encode(md5);
通过指纹算法得到的同位数随机数是以二进制数组返回的。不能简单的封装到String中,因为在转换过程中有些随机数可能在码表中查不到,就会得到很多乱码。所以我们需要用base64编码技术将二进制数变为我们键盘上的明码,再返回给上层。
base64编码算法: 将每3个字节的数存入4个字节中。即每6bit 二进制数,转存到8bit中,补上2个前导0。则转换之后每个字节的有效位为后6位。这样做之后,就可以将任意的6位二进制数
都转换为00000000~00111111 中,即0~63。由于base64自带码表将0~63都映射到了键盘的上每个可见明码。所以通过这种算法就能将任意的二进制数转换为键盘上的可见明码。