利用同步令牌(Token)機制可以解決Web應用中重復提交的問題,Struts通過org.apache.struts.action.Action類中提供的一系列和Token相關的方法給出一個參考實現:
1.protected boolean isTokenValid(javax.servlet.http.HttpServletRequset requset)
判斷存儲在當前用戶會話中的令牌值和請求參數中的令牌值是否匹配。如果匹配,就返回true,否則返回false.只要符合以下情況之一,就會返回false:
2.protected void resetToken(javax.servlet.http.HttpServletRequest request)
從當前session范圍內刪除令牌屬性。
3.protected void saveToken(javax.servlet.http.HttpServletRequest request)
創建一個新的令牌,並把它保存在當前session范圍內,如果HttpSession對象不存在就首先創建一個HttpSession對象。
同時<html:form>標簽的實現類org.apache.struts.taglib.html.FormTag的renderToken()方法判斷在session范圍內是否存在Token,如果存在,就在表單中生成一個包含Token信息的隱藏字段,也就是說我們直接使用Struts的表單標簽<html:form>就行,不用手動的添加判斷獲取 session中的Token。
下面就一個小例子來詳細的講敘Struts中如何利用Token解決重復提交:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Struts-Token</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>