首先工具类代码如下:
public class TokenProccessorUtil {
HttpServletRequest request = null;
/*
*单例设计模式(保证类的对象在内存中只有一个)
*1、把类的构造函数私有
*2、自己创建一个类的对象
*3、对外提供一个公共的方法,返回类的对象
*/
private TokenProccessorUtil(){}
private static final TokenProccessorUtil instance = new TokenProccessorUtil();
/**
* 返回类的对象
* @return
*/
public static TokenProccessorUtil getInstance(){
return instance;
}
/**
* 生成Token但是会生成一些非法 字符所以直接用时间
* Token:Nv6RRuGEVvmGjB+jimI/gw==
* @return
*/
public String makeToken(){ //checkException
// 7346734837483 834u938493493849384 43434384
String token = (System.currentTimeMillis() + new Random().nextInt(999999999)) + "";
//String token = java.util.UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
//数据指纹 128位长 16个字节 md5
try {
// MessageDigest md = MessageDigest.getInstance("md5");
// byte md5[] = md.digest(token.getBytes());
//base64编码--任意二进制编码明文字符 adfsdfsdfsf
// BASE64Encoder encoder = new BASE64Encoder();
// return encoder.encode(md5);
return token;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 判断是否重复提交,针对某些用户点击过快
* @param client_token
* @param server_token
* @return
*/
public boolean isRepeatSubmit(String client_token,String server_token) {
//1、如果用户提交的表单数据中没有token,则用户是重复提交了表单
if(client_token==null){
return true;
}
//取出存储在Session中的token
//String server_token = (String) request.getSession().getAttribute("token");
//2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单
if(server_token==null){
return true;
}
//3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单
if(!client_token.equals(server_token)){
return true;
}
return false;
}
public static void main(String[] args) {
for(int i=0;i<9;i++){
System.out.println(TokenProccessorUtil.getInstance().makeToken());
}
}
}
简单使用如下:
表单提交的JSP(一般不在jsp写Java代码,自己研究使用方式,以下仅供参考)
创建令牌并作为隐藏参数放在表单中
//创建令牌
String token = TokenProccessorUtil.getInstance().makeToken();
//在服务器使用session保存token(令牌)
request.getSession().setAttribute("token", token);
<form name="searchForm" action="xxx.jsp" method="post">
<input type="hidden" name="token" value="<%=session.getAttribute("token") %>"/>
处理逻辑的jsp或者action进行判断:
xxx.jsp
if(!StrUtil.isNull(client_token)){// StrUtil是额外写的工具类,网上一堆
boolean b = TokenProccessorUtil.getInstance().isRepeatSubmit(token,server_token);
if(b==true){
out.println("<script>alert('查询出错,请不要频繁点击!');</script>");
return;
}
request.getSession().removeAttribute("token");//移除session中的token
}