一个随机数发生器 用于在服务器和客户机直接进行安全性验证的类
在服务器向客户端提供服务时 有可能页面遭到了修改 但是服务器无法进行验证用户提交的页面是否
是自己服务器发送页面 那么就可以采用一个随机函数发生器 发送一个字符给客户机 在客户机提交数据
时进行验证 是否是自己提供的页面 我们可以采取随机数的方式进行这个任务
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Random; import sun.misc.BASE64Encoder; import com.sun.mail.util.BASE64EncoderStream; /* * 这里只是希望建立一个随机数发生器 而且只允许外界调用这个随机数发生器 * 也就是说 这个随机数发生器 不对外提供构造方法 只可以拥有一个实例 * 外界可以通过静态方法 获取到这个随机数发生器 */ public class TokenProcessor { /********************** * 1.把构造方法私有化 * 2.自己创建一个实例对象 * 3.对外暴露实例对象的获取方法 */ //1.将构造方法实例化 private TokenProcessor(){}; //2.自己创建一个 private static final TokenProcessor instance =new TokenProcessor(); //3.对外暴露一个方法 可以用于获取这个实例对象的 public static TokenProcessor getProcessor(){ return instance; } public String getGenerateString(){ /******************************************************* *这里出现了一个重要的思想 服务器验证的随机数据产生问题 *最好是一个和当前时间相关 不太可能会重复的数据 而且带有一定的随机性 * */ String token = System.currentTimeMillis()+new Random().nextInt()+" "; try { /* * 关于messageDigest类是为应用程序提供安全信息摘要算法的功能 * 如 MD5 或者SHA * * 这里返回的是提供MD5算法摘要的对象 */ MessageDigest md=MessageDigest.getInstance("md5"); /*这里是md5算法对象的提供者使用digest()方法 获取token * 这个数据的md5数组 完成哈希计算 * 主要这里提供的数据需要先将其转化为byte[]数组 */ byte[] md5=md.digest(token.getBytes()); /* * 接下来需要将字节数组数据转化为字符串 但是如果 * 直接new String(md5); 如果没有指定会是GB2312或者ISO-8059-1 * 这时候又存在乱码问题 * 这时候可以采用base64编码 */ BASE64Encoder encoder =new BASE64Encoder(); return encoder.encode(md5); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } }
这是一个静态类 对外提供一个实例对象 可以获取到一个随机函数 进行验证时使用 在用户进行页面请求时发送随机码
在用户提交时返回这个随机码
下面实验一下是否用
public class TokenDemo { public static void main(String[] args) { TokenProcessor tokenProcessor =TokenProcessor.getProcessor(); String token=tokenProcessor.getGenerateString(); System.out.println(token); } }
恐惧源于无知,代码改变世界