最近開發中涉及到了表單重複提次的問題,通過研究做個總結。
防止表單重複送出主要用的到
标簽: <s: token />
攔截器: <interceptor-ref name="token" />
預設的傳回值: <result name="invalid.token">/input.jsp</result>
在頁面加載時<s:token />産生一個guid(globally unique identifier—全局唯一辨別符)值的隐藏輸入框如:
<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="bxpnndg6bb11zxhpi4e106cz5k7vnmhr"/>
同時,将guid放到會話(session)中。在執行action之前,token攔截器将會話token與請求token比較,如果兩者相同,則将會話中的token删除并往下執行,否則向actionerrors加入錯誤資訊。如此一來,如果使用者通過某種手段送出了兩次相同的請求,兩個token就會不同。
action
import com.opensymphony.xwork2.actionsupport;
public class testaction extends actionsupport {
private static final long serialversionuid = 6820659617470261780l;
private string message;
public string getmessage() {
return message;
}
public void setmessage(string message) {
this.message = message;
@override
public string execute() {
system.out.println("executing action, your message is " + message);
return success;
}
}
jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<head>
<title>token測試</title>
<s:head />
</head>
<body>
<s:actionerror />
<s:form action="testaction" >
<s:textfield name="message" label="message" />
<s:token />
<s:submit />
</s:form>
</body>
struts2的配置檔案
<struts>
<package name="test" extends="struts-default" namespace="/testtoken">
<action name="test" class="com.fhx.testaction">
<result name="invalid.token">/input.jsp</result>
<result>/input.jsp</result>
<interceptor-ref name="defaultstack" />
<interceptor-ref name="token" />
</action>
</package>
</struts>
以上xml片段值注意的是加入了token攔截器和invalid.token結果。
因為token攔截器在會話token與請求token不一緻時,将會直接傳回invalid.token結果。
也可以導航到<result name="invalid.token">/error.jsp</result>。
原帖位址:http://blog.csdn.net/fhx007/article/details/3925653