在某些情况下,如果用户对一个HTML表单重复提交,Web应用应该必须能够判断用户的重复提交行为,以做相应的处理。
Struts给出了一个参考实现。org.apache.struts.action.Action类中提供了一系列和Token有关的方法:
1.protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request)
判断存储在当前用户会话中的令牌值和请求参数中的令牌值是否匹配,如果匹配就返回true,否则返回false.
2.protected void resetToken(javax.servlet.http.HttpServletRequest request)
从当前session中删除令牌值。
3.
protected void saveToken(javax.servlet.http.HttpServletRequest request)
创建一个新令牌,并把他保存在session范围内。
提示:具体的Token处理逻辑是org.apache.struts.util.TokenProcesor类完成的,大家可以反编译看看这个类的处理逻辑。它的generateToken(request)方法根据用户会话ID和当前的系统时间来生成一个唯一的令牌值。
流程:
比如一个注册流程,在用户请求注册页面之前,是由一个Action转发给到这个注册页面,在这个Action中加入saveToken(request)方法,创建一个Token,并把它保存在session中。然后转发给注册页面。在注册页面的<html:form>标签的处理类会判断session中是否存在Token,如果存在就在表单中生成一个隐藏域,隐藏域的值就是利用Struts的Token机制算出来的那个值。当用户接收到注册页面后就会发现在FORM表单中存在的Token的隐藏域。在用户提交了注册信息到另一个Action中时,在这个Action中用isTokenValid(request)来判断是否是重复提交,如果用户是第一次提交表单返回true,如果用户通过浏览器返回按扭,返回该页再次提交则返回false;进行错误处理。
例子:
Action1:
public class RegAction extends Action
{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
//调用方法生成Token
saveToken(request);
// TODO Auto-generated method stub
return mapping.findForward("register");
}
}
public class RegAction extends Action
{
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
//调用方法生成Token
saveToken(request);
// TODO Auto-generated method stub
return mapping.findForward("register");
}
}
Action1转发给JSP页面:
<html:form action="/tokenAction.do" method="poset">
<html:submit>Submit</html:submit>
</html:form>
<html:form action="/tokenAction.do" method="poset">
<html:submit>Submit</html:submit>
</html:form>
在这里会自动生成Token的隐藏域:
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="164fcc77cafd18db1011da3d8ab868e5">
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="164fcc77cafd18db1011da3d8ab868e5">
Action2: jsp页面提交给过来请求
if(!isTokenValid(request))
{
System.out.println("重复提交TokenAction");
saveToken(request);
return (new ActionForward(mapping.getInput()));
}
else
{
resetToken(request);
System.out.println("重新设置Token! TokenAction");
}
if(!isTokenValid(request))
{
System.out.println("重复提交TokenAction");
saveToken(request);
return (new ActionForward(mapping.getInput()));
}
else
{
resetToken(request);
System.out.println("重新设置Token! TokenAction");
}
判断是否是重复提交,如果重复提交就转发到默认在struts-config.xml中为Action2配置的错误页面中,并重新建立一个Token。如果不是重复提交就就从当前session中删除Token.
OK,就是这些了,如果你的应用中可以返回一个错误页面,那么你也可以在filter中应用Token这些方法,只不过需要对struts的jar包进行反编译,拿到自己的类中来用。
分享到:
相关推荐
- **Struts2概述**:Struts2是一个开源的MVC框架,它结合了Struts 1.x、WebWork和其他一些框架的优点。Struts2的主要目标是简化Web应用程序的开发过程。 - **Struts2的起源**:Struts2最初由WebWork和Struts1的核心...
5.5 避免重复提交功能 5.6 缩略加水印图像 5.7 小结 第6章 网络硬盘 6.1 网络硬盘功能原理 6.2 网络硬盘功能具体实现——浏览磁盘和显示文件信息 6.3 网络硬盘功能具体实现——操作文件夹和文件...
- **防止表单重复提交**:为了避免用户误操作导致的多次请求,可以通过令牌机制或JavaScript禁用提交按钮来防止重复提交。 **5. 用户界面组件** - **复选框的使用技巧**:在Struts中处理复选框的数据通常需要使用...
Validator框架则是Struts 1.x中的增强功能,允许更灵活的XML配置和可重用的验证规则。 4. **Validator框架** - **ValidatorConfig**:配置文件(如struts-validator.xml或struts-config.xml)定义了验证规则和错误...
`Struts1.x令牌(Token)的使用.rar`则涉及Struts 1.x框架中的令牌机制,这是一种防止重复提交和跨站请求伪造(CSRF)的安全措施。在表单提交过程中,Struts会生成一个唯一的令牌并存储在session中,同时将其作为隐藏...
Spring Web Flow 1.x 版本虽然能够与其他 Web 框架(如 Struts、JSF)进行整合,但在 2.0 版本中,它被明确设计为 Spring MVC 的一个扩展。这意味着开发者可以更容易地在现有的 Spring MVC 应用程序中集成 Spring ...
- **token防止表单重复提交拦截器**:防止用户重复提交表单。 - **自定义拦截器**:可以通过实现Interceptor接口来创建自定义拦截器。 #### 六、Hibernate基础 ##### 1. 持久化、持久层 - **持久化**:将内存中的...
- **Vert.x**:轻量级的事件驱动框架。 - **Netty**:高性能网络编程框架。 #### 缓存过期策略 - **基于时间的过期**:设置固定的过期时间。 - **基于引用的过期**:当引用不再被使用时自动清除。 - **基于容量的...