防止刷新-struts token新解决方案
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表示调用该方法后重新生成一个令牌值,保证只接受一次提交
该方法适用于各个项目.
希望对大家解决重复提交有好处
做了几次.觉得很麻烦.我的项目里不想用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表示调用该方法后重新生成一个令牌值,保证只接受一次提交
该方法适用于各个项目.
希望对大家解决重复提交有好处
...全文
相关推荐
Struts2防止表单重复提交
造成重复提交主要的两个原因: 1) 一是,服务器处理时间久。当用户在表单中填完信息,点击“提交”按钮后,由于服务器反应时间过长没能及时看到响应信息,或者出于其它目的,再次点击“提交”按钮,从而导致在服务器端接收到两条或多条相同的信息。如果信息需要存储到后台数据库中,如此以来就会产生数据库操作异常提示信息,以至于给用户带来错误信息提示,从而给用户的使用带来不便。 2) 二是,forward跳转引起的重复提交。当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。当然你可以选择redirect方式跳转页面,这样就不会出现重复提交的问题;但有时为了达到某种效果或式。者出于网站安全的目的需要隐藏网页跳转,而不得不采用forward跳转方
防止表单重复提交
这是一个关于防止表单重复提交的练习,大神勿喷!
struts token 防止页面刷新,重复提交
提供源代码和思想,整体架构都在,只需加入你自己的业务逻辑即可。
struts2_token控制刷新重复提交
struts2_token控制刷新重复提交
struts2利用token防止表单重复提交(源代码)
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台输出效果


Java SE
