做了幾次.覺得很麻煩.我的項目裏不想用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表示調用該方法後重新生成一個令牌值,保證只接受一次提交