利用同步令牌(Token)机制可以解决Web应用中重复提交的问题,Struts通过org.apache.struts.action.Action类中提供的一系列和Token相关的方法给出一个参考实现:
1.protected boolean isTokenValid(javax.servlet.http.HttpServletRequset requset)
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配。如果匹配,就返回true,否则返回false.只要符合以下情况之一,就会返回false:
不存在HttpSession对象
在session范围内没有保存令牌值
在请求参数中没有令牌值
存储在当前用户session范围内的令牌和请求参数的令牌值不匹配
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解决重复提交:
1,配置web.xml,装配Struts框架:<?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 " 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>