[b]参考struts的token(令牌)机制[/b]
在提交的时候在Servlet中根据用户的sessionid和当前时间的long值生成一个令牌(每次提交都会生成一个新令牌),将令牌保存在该用户的会话中,并将令牌的值以request属性形式传到前端页面,在前端页面的form中增加传递令牌的隐藏域<input type="hidden" name="clientToken" value="<%=clientToken%>" />,提交form的时候,也会将clientToken传入Servlet,如果session中保存的令牌值与传入的不同,则是重复提交,因为每次请求Servlet都会生成新的令牌,刷新时的令牌值是旧的令牌值,不是最新的令牌值。
在提交的时候在Servlet中根据用户的sessionid和当前时间的long值生成一个令牌(每次提交都会生成一个新令牌),将令牌保存在该用户的会话中,并将令牌的值以request属性形式传到前端页面,在前端页面的form中增加传递令牌的隐藏域<input type="hidden" name="clientToken" value="<%=clientToken%>" />,提交form的时候,也会将clientToken传入Servlet,如果session中保存的令牌值与传入的不同,则是重复提交,因为每次请求Servlet都会生成新的令牌,刷新时的令牌值是旧的令牌值,不是最新的令牌值。
jsp:
<%
//获取令牌、防止刷新重复提交
String clientToken = (String)request.getSession().getAttribute("clientToken");
clientToken = (StringUtils.isEmpty(clientToken)) ? "" : clientToken;
%>
<form>中增加<input type="hidden" name="clientToken" value="<%=clientToken%>" />
java:
/**
* 令牌验证防止刷新提交
*/
private String clientToken;
/**
* 验证防止刷新重复提交
* @return
*/
private boolean validateToken()
{
boolean bl = false;
try
{
String sessionToken = (String) getHttpRequest().getSession().getAttribute(
"token");
if (StringUtils.isNotEmpty(sessionToken) && !clientToken.equals(sessionToken))
{
// 禁止刷新
bl = false;
}
else
{
// 正常的操作
bl = true;
// 生成新令牌
String sToken = UUID.randomUUID().toString().toUpperCase();
getHttpRequest().getSession().setAttribute("clientToken", sToken);
// 替换旧令牌
getHttpRequest().getSession().setAttribute("token", sToken);
}
}
catch (Exception e)
{
LOGGER.error(e.getMessage());
}
return bl;
}