`

struts2禁止表单重复提交

 
阅读更多

token拦截器的使用
a.在JSP表单中添加<s:token/>标签.
b.在struts.xml的action配置中,添加token拦截器的引用
<interceptor-ref name="token"/>
token拦截器负责将表单中的ID与session中ID对比
c.在struts.xml的action配置中,添加action中<result=invalid.token>视图.jsp</result>.
如果拦截器发现重复提交,将自动调用此视图响应.
tokenSession拦截器的使用
a,b两步与token的使用相同.不需要c步骤
tokenSession如果发现重复提交,将采用第一次提交的响应界面
原理:如果是第一次进入表单会生成一个唯一ID session存着这个ID Hidden也存着id当提交给服务器
服务器检查Session中的ID和hidden一致则提交成功同时会把session中的id清掉

 

配置struts.xml文件,声明动作

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="avoidPackage" extends="struts-default">

<action name="avoid" class="struts2.action.AvoidAction">

<interceptor-ref name="token"></interceptor-ref>

<interceptor-ref name="defaultStack"></interceptor-ref>

<result name="invalid.token">/error.jsp</result>

<result name="input">/input.jsp</result>

<result name="success">/output.jsp</result>

</action>

</package>

</struts>

此时,需要在动作的声明中,为动作添加token拦截器,因为token拦截器不在defaultStack拦截器栈中,注意,需要将拦截器放在拦截器栈的第一位,这是因为判断表单是否被重复提交的逻辑应该在表单处理前。

例子:

创建动作类

public class AvoidAction extends ActionSupport {

private static final long serialVersionUID = 2676453800249807631L;

private String username;

private Date birthday;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

@Override

public String execute()

{

try {

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return SUCCESS;

}

}

这个动作逻辑处理为挂起4秒钟,让我们有机会多次点击提交按钮,测试效果。

创建页面:

input.jsp

<s:form action="avoid">

<s:token>

</s:token>

<s:textfield name="username" label="Enter your name"></s:textfield>

<s:textfield name="birthday" label="Enter your birthday"></s:textfield>

<s:submit value="submit">

</s:submit>

</s:form>

 

测试:

在提交时按F5 或一直点击submit看到控制台出警告了

分享到:
评论

相关推荐

    struts2防止表单重复提交--重定向

    下面将详细解释Struts2如何通过重定向来防止表单重复提交。 首先,理解表单重复提交的场景:用户在提交表单后,由于网络延迟或其他原因,可能会无意中多次点击提交按钮。如果服务器没有处理这些重复请求,那么相同...

    在客户端限制表单重复提交有两种方法

    本文将详细阐述两种客户端限制表单重复提交的方法,并结合Struts框架的Token机制进行深入理解。 ### 第一种方法:JavaScript设置标志变量 这种方法通过在JavaScript中定义一个标志变量`repeatSubmitFlag`来判断...

    J2EE框架-重复提交、重复刷新、防止后退的问题以及处理方式

    - Struts框架提供了一些机制来处理重复提交,如使用Session令牌(Token)机制。在用户提交表单前,服务器生成一个唯一的Token并存储在Session中,同时将其作为隐藏字段放在表单中。当用户提交表单时,服务器检查...

    JSP_重复提交_解决方法

    **场景说明**:重复提交和刷新通常发生在用户操作过程中,特别是在提交表单后,如果用户不知道操作是否成功完成,可能会尝试刷新页面或重复点击提交按钮,这就会导致数据被重复提交到服务器。 **是否需要处理**:...

    struts2上传下载

    2. **表单设计**:创建一个HTML表单,设置`enctype="multipart/form-data"`属性,使表单支持多部分数据提交。同时,添加一个`&lt;input type="file"&gt;`元素用于选择待上传的文件。 3. **Action配置**:在`struts.xml`中...

    利用Struts2的令牌机制。

    在Struts2中,令牌机制是用于防止重复提交(Duplicate Form Submission)和跨站请求伪造(Cross-Site Request Forgery, CSRF)的安全措施。下面我们将深入探讨这一机制。 首先,我们需要理解什么是重复提交。当用户...

    jsp 重复提交问题

    1. 在表单页的 HEAD 区加入禁止缓存的 meta 标签,以避免浏览器缓存导致的重复提交。 , must-revalidate"&gt; , 26 Feb 1997 08:21:57 GMT"&gt; 2. 使用 Token 机制,生成一个令牌保存在用户 Session 中,在 form 中加...

    Java中的Struts2框架拦截器之实例代码

    然后,在用户提交数据时,服务器可以检查该随机数是否存在于 Session 中,如果不存在,则禁止提交数据,这样可以防止重复提交数据。 下面是一个使用 Token 拦截器控制重复提交的示例代码: struts.xml: ``` ...

    收集的struts+spring+hibernate面试题.doc

    - `ISOLATION_REPEATABLE_READ`:可重复读,禁止脏读和不可重复读。 - `ISOLATION_SERIALIZABLE`:最高隔离级别,完全禁止并发,性能最低。 - **传播行为**: - `PROPAGATION_REQUIRED`:如果有事务则加入该事务...

    紫光华宇java面试

    - 表单提交前通常使用`onsubmit`事件进行验证 9. **CSS选择器** - `#abc`:ID选择器,选择ID为`abc`的元素 - `.abc`:类选择器,选择class为`abc`的所有元素 10. **换行** - ` `用于在HTML中插入一个换行 ...

Global site tag (gtag.js) - Google Analytics