1.新建PrepareInsertAction.java,InsertAction.java,InsertForm.java:
PrepareInsertAction.java:
public class PrepareInsertAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// 创建一个新的令牌
this.saveToken(request);
return new ActionForward("/insert.jsp");
}
}
InsertAction.java:
public class InsertAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
InsertForm insertForm = (InsertForm) form;
//32位的随机码 可以判断前后两次提交是否相等 即: isTokenValid(request)
System..println(request.getParameter("org.apache.struts.taglib.html.TOKEN"));
//判断当前用户session范围内的令牌值和请求参数中的令牌值是否相等
if(!isTokenValid(request)){//如果两个值相等,即表单重复提交
this.saveToken(request);
return new ActionForward("/insert.jsp");
}else{//当用户首次提交时返!isTokenValid()返回true
this.resetToken(request);//将用户session中的token清空
}
return null;
}
}
InsertForm.java:
public class InsertForm extends ActionForm{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.配置struts-config.xml:
<form-beans>
<form-bean name="insertForm"
type="com.and4walker.struts.form.InsertForm" />
</form-beans>
<action-mappings>
<action attribute="insertForm" input="/insert.jsp" name="insertForm"
path="/insert" scope="request"
type="com.and4walker.struts.action.InsertAction" />
<action path="/prepareInsert"
type="com.and4walker.struts.action.PrepareInsertAction" />
</action-mappings>
3.建立index.jsp跟insert.jsp:
index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
<body>
先事先保存一个tokenid<br/>
<html:link action="prepareInsert">insert</html:link>
</body>
</html>
insert.jsp:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<html>
<body>
<html:form action="/insert">
内容:<html:text property="name"/><br/>
<html:submit value="提交"/>
</html:form>
</body>
</html>
原理:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
第一:你需要在请求中有这个令牌值,请求中的令牌值如何保存,其实就和我们平时在页面中保存一些信息是一样的,通过隐藏字段来保存,保存的形式如: 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,这个value是TokenProcessor类中的generateToken()获得的,是根据当前用户的session id和当前时间的long值来计算的。第二:在客户端提交后,我们要根据判断在请求中包含的值是否和服务器的令牌一致,因为服务器每次提交都会生成新的Token,所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。
分享到:
相关推荐
这样,即使用户再次提交表单,由于Session中的Token已被删除,验证将会失败,从而避免了重复提交。 5. **错误处理**: 如果验证失败,服务器可以返回一个错误提示,告知用户请求可能已处理,无需再次提交。 在...
1. **创建Token:** 当用户打开一个需要防止重复提交的表单时,Action类需要生成并设置Token。通常在准备(Prepare)阶段进行,例如在`prepare()`方法中。 ```java public class MyAction extends ActionSupport { ...
例如,当用户在长时间未操作后再次提交表单,可能需要清除旧的token,避免误报重复提交。此外,对于并发请求,需要确保并发处理的安全性,防止因并发导致的重复提交。 总结,Struts2的tokenSession机制是JavaEE Web...
1. **配置Action**:在Struts的配置文件(struts.xml或struts.properties)中,为需要防止重复提交的Action添加一个拦截器,通常是`token`和`tokenSession`拦截器。 2. **生成Token**:在Action的准备方法(Prepare...
1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <interceptor-ref name="token"/> <result name="success">/success.jsp ...
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
为了避免这种情况的发生,Struts框架提供了内置的Token机制来防止重复提交。 #### 一、Token机制原理 Token机制是一种常见的防止重复提交的方法,其核心思想是为每一次表单提交生成一个唯一的Token值,并将这个...
在Struts配置文件中,为需要防止重复提交的Action添加一个拦截器引用,如`token`或`token-session`。这两个拦截器都可以处理Token,但`token-session`更安全,因为它会将Token存储在会话中,而不仅仅是请求中。 2....
总的来说,Struts 1.2的Token机制提供了一种简单但有效的防止重复提交的解决方案。通过理解和实践这一机制,开发者可以更好地保护Web应用程序的数据一致性。同时,深入研究源码有助于加深对Struts工作原理的理解,...
本文将详细介绍如何在Struts框架中利用Token机制来避免重复提交问题。 #### 一、什么是重复提交问题? 重复提交问题通常发生在用户点击“提交”按钮后网络延迟导致页面加载缓慢的情况下,用户可能会多次点击提交...
Struts的Token机制是Web应用中防止表单重复提交的一种常用方法。在处理表单提交时,如果用户意外地多次点击了提交按钮,可能会导致数据的重复录入,从而引起不必要的问题,例如订单重复、数据库数据异常等。为了解决...
通过上述介绍可以看出,Struts的Token机制提供了一种简单而有效的解决方案来避免表单重复提交的问题。开发者只需要遵循一定的编码规范和逻辑结构,就可以轻松地在自己的项目中实现这一机制。这对于提高Web应用的数据...
当用户尝试重复提交表单时,Struts2会检测到Token已经使用过,因此会抛出异常。你可以捕获这个异常并给出相应的提示,例如: ```java public class MyAction extends ActionSupport { @Override public void ...
- 完成对表单数据的处理后,调用`resetToken()`方法清除`HttpSession`中的Token值,避免重复提交。 #### 四、非Struts框架下的Token机制实现 对于非Struts框架的应用程序,也可以采用类似的Token机制来防止表单...
如果用户在未完成提交的情况下刷新页面,可能会造成重复提交。为了处理这种情况,可以在JSP页面的`<head>`标签内添加以下代码,利用JavaScript阻止表单的重复提交: ```jsp function preventDoubleSubmit(form...
这样,当发生重复提交时,Struts2框架会自动处理并转向token.jsp页面,提示用户重复提交了表单。 对于第二种原因,即提交表单后刷新浏览器页面导致的重复提交,Struts2框架允许开发者通过配置结果视图的跳转方式来...
Struts2 Token回退刷新是一种防止重复提交的安全机制,尤其在处理并发操作和防止 CSRF(跨站请求伪造)攻击时显得尤为重要。Struts2框架提供了一种令牌验证的方式来确保每个表单提交是唯一的,避免了恶意用户通过...
下面将详细讲解Struts2令牌解决重复提交问题的过程: 1. **生成令牌**:在Action中,使用`TokenAwareActionSupport`作为基类,这个类实现了`TokenSessionStore`接口,可以方便地获取和验证令牌。在表单展示之前,...
在 Struts 中,"重复提交 token" 是一个重要的概念,用于防止用户意外或恶意地多次提交同一个表单,从而确保数据的一致性和安全性。 在 Web 应用中,重复提交问题可能出现在用户网络不稳定或误操作的情况下,导致同...