请求有效性处理,使用令牌可以有效的防止重复提交。
protected String generateToken(HttpServletRequest request) 创建一个令牌.
protected boolean isTokenValid(HttpServletRequest request) 检查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 检查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
在jsp加入隐藏字段
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value='${sessionScope["org.apache.struts.action.TOKEN"] }' />
先在addElement方法里加入saveToken(request);然后会跳转到加了上面隐藏字段jsp页面,最后jsp提交到saveHvA103方法,能判断页面令牌值和服务端保存的值是否一致,如不一致显示“请不要重复提交”
=============================
下面是转载的其他的重复提交的例子(未经过测试,先保存备用)
struts token一般需要进行2个action才能做到防止刷新.
做了几次.觉得很麻烦.我的项目里不想用struts.只是想把struts token用在非struts项目里.
通过研究.找到一个新的方法.可以应用到所有的项目中.
首先struts token原理是:
1.生成令牌
2.在表单隐含框里显示令牌值
3.提交表单,对隐含框令牌值与系统存的令牌值进行比较.如果正确说明没重复提交.错误说明有重复提交
4.清除令牌值
上面是原理.令牌值是以session值保存.所以只需要做2件事就可以实现struts token功能
建2个页面。1个页面test1.jsp(用于提交表单用),另一个页面test2.jsp(接收表单值)
1.test1.jsp如下
<%
org.apache.struts.util.TokenProcessor.getInstance().saveToken(request);
%>
<form action="test2.jsp" method="post">
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="<%=session.getAttribute("org.apache.struts.action.TOKEN")%>" />
<label>username
<input type="text" name="username" />
</label>
<p>
<label>password
<input type="text" name="password" />
</label>
</p>
<p>
<label>
<input type="submit" name="Submit" value="Submit" />
</label>
</p>
</form>
2.test2.jsp如下
<%
Thread.sleep(3000);
String username="";
String password="";
if(org.apache.struts.util.TokenProcessor.getInstance().isTokenValid(request,true))
{
username=request.getParameter("username");
password=request.getParameter("password");
int val=com.test.test.getVal();
System.out.println(val+"*********username:"+username);
System.out.println(val+"*********password:"+password);
org.apache.struts.util.TokenProcessor.getInstance().resetToken(request);
}
else
{
org.apache.struts.util.TokenProcessor.getInstance().saveToken(request);
System.out.println("error");
}
%>
username:<%=username%>
<br/>
password:<%=password%>
<br/>
说明:
saveToken方法就是生成一个令牌值,放在session里.session名为:org.apache.struts.action.TOKEN
isTokenValid(request,true):判断提交令牌值是否和session值一样.true表示调用该方法后重新生成一个令牌值,保证只接受一次提交
该方法适用于各个项目.
希望对大家解决重复提交有好处