jsp、servlet防止刷新重复提交

[b]参考struts的token(令牌)机制[/b]

在提交的时候在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值