在开发的时候,很多时候会需要防止用户重复提交表单。在
Strut2
中可以方便的实现这个功能。
防止表单重复提交主要用到的标签是<s: token />,拦截器
<
interceptor-ref
name
="token"
/>,
还有一个默认的返回值
<
result
name
="invalid.token">
/input.jsp
</
result
>
在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:
<
input
type
="hidden"
name
="struts.token.name"
value
="struts.token"/>
<
input
type
="hidden"
name
="struts.token"
value
="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>
同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。注意:产生的
html
代码中,
struts.token.name
是永远不变的,而
struts.token
是可以改变的(通过在
jsp
中引入标签
<s:token name="
你想取的名字
"/>
,这里的
name
属性就会取代掉
struts.token
),另外,两个
struts.token
是关联在一起的。
举个例子:
以下为action代码
package com.polaris.token;
import com.opensymphony.xwork2.ActionSupport;
public class TokenAction extends ActionSupport
{
private static final long serialVersionUID = 1L;
private String message;
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
@Override
public String execute() throws Exception
{
System.out.println("执行Action, 输出内容:" + getMessage());
return SUCCESS;
}
}
清单
1
:
TokenAction
代码
再看看JSP的写法
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
">
<html xmlns="
http://www.w3.org/1999/xhtml
">
<head>
<title>struts token</title>
<s:head />
</head>
<body>
<s:actionerror />
<s:form action="
token
" >
<s:textfield name="message" label="Message" />
<s:token /> <%-- 注意这里,记得放在
form
表单内,可以自己给
token
命名--%>
<s:submit />
</s:form>
</body>
</html>
清单
2
:
message.jsp
下面是struts2的配置文件
<?
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
="
struts2
"
extends
="struts-default">
<
action
name
="
token
"
class
="com.polaris.token.TokenAction">
<
result
name
="invalid.token">
/
message
.jsp
</
result
>
<!--注意此处-->
<
result
>
/
message
.jsp
</
result
>
<
interceptor-ref
name
="defaultStack"
/>
<
interceptor-ref
name
="token"
/
>
</
action
>
</
package
>
</
struts
>
清单
3
:
struts.xml
以上XML片段值注意的是加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话token与请求token不一致时,将会直接返回“invalid.token”结果。
启动服务器,在浏览器地址栏输入:
http://localhost:8080/struts2/message.jsp
(根据你配置的
Tomcat
不同,地址有所不同)出现图
1
所示内容
图
1
:没有提交时
第一次提交后,如图
2
图
2
:第一次提交后没有错误信息
接着点击刷新按钮,确定后出现如图
3
所以内容
图
3
:刷新页面后(即重复提交)
上面的错误提示信息是
Struts2
给我们定义好的(在
struts2-core.jar
内的
org.apache.struts2
包下有一个
struts-message.properties
资源文件。里面定义了一些可配置常量
,
其中就有
struts.messages.invalid.token
)
具体配置如下:
-
在src文件夹中加入struts.properties文件,内容如下:
struts.custom.i18n.resources=
testToken
![]()
|
Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
-
struts.xml用于应用程序相关的配置
-
struts.properties用于Struts 2.0的
运行时(Runtime)的配置
|
-
在src文件夹中加入
testToken_zh_CN.properties
文件,内容如下:
struts.messages.invalid.token
=
你已经提交了,不能再提交!
在此只实现了中文显示(对多语言可以配置相应的内容)
重启服务器后,重复上面的执行操作。出现如图
4
所示内容:
图
4
:出现了刚才定义的中文信息提示
相关推荐
Struts2框架提供了一种解决方案,即使用Token机制来防止表单的重复提交。以下是对这个主题的详细说明: 1. **表单重复提交问题**:当用户在提交表单时,由于网络延迟或用户误操作,可能会导致同一个表单被多次提交...
### Struts2防止表单重复提交的技术解析 #### 一、引言 在Web应用程序开发过程中,表单重复提交是一个常见的问题,特别是在网络环境不稳定或用户误操作的情况下。这种重复提交不仅可能导致数据冗余,还可能引起事务...
下面将详细解释Struts2如何通过重定向来防止表单重复提交。 首先,理解表单重复提交的场景:用户在提交表单后,由于网络延迟或其他原因,可能会无意中多次点击提交按钮。如果服务器没有处理这些重复请求,那么相同...
在Struts2中防止表单重复提交的过程主要包括以下几个步骤: 1. **生成Token**:当用户发起表单请求时,服务器会生成一个唯一的Token并将其存储在服务器的会话(Session)中,同时将这个Token作为隐藏字段放入到HTML...
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
Struts2作为一个流行的Java Web框架,为解决表单重复提交提供了多种方法。 首先,关于表单重复提交的原因,有以下几点: 1. 服务器或网络延迟导致用户多次点击提交按钮。 2. 用户在表单提交后刷新浏览器页面。 ...
在Struts2中,防止重复提交是一个重要的问题,因为它可能导致数据不一致性和服务器资源的浪费。本文将详细介绍如何在Struts2中解决这个问题,以及相关的技术概念。 首先,我们要理解Struts2中的拦截器(Interceptor...
本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...
Struts2提供了一种简单有效的方法来解决表单重复提交的问题,即通过使用`<s:token>`标签和相关的拦截器。 1. **实现原理**: - 在每次表单提交前,Struts2会生成一个唯一的令牌(Token),并将其存储在用户的Session...
"防止表单重复提交 token"是Struts2提供的一种解决方案,通过在请求中加入一个唯一的token来确保请求的唯一性和一致性。 首先,我们来看如何实现这个机制。在Struts2中,我们可以使用拦截器(Interceptor)来实现...
在实际应用中,文件上传和下载以及防止表单重复提交是两个常见的需求,同时也是开发者必须掌握的重要技能。 1. **文件上传** 文件上传功能在Struts2中通过`Struts2`提供的插件来实现,主要依赖于`Apache Commons ...
Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2的Token插件是防止重复提交的一种常见方法。这里的"Strut2Token"很可能是指这个插件的应用。它的...
Struts2是一个流行的Java web框架,它...总的来说,Struts2的令牌机制是通过生成和验证令牌来防止重复提交和CSRF攻击的有效方式。开发者应当理解其工作原理,并在需要的地方正确使用,以提高应用程序的安全性和稳定性。
本主题将深入探讨Struts框架中的数据回显、模型驱动以及如何防止表单重复提交,这些都是在实际开发中非常关键且实用的技术点。 1. 数据回显: 数据回显是指在用户提交表单后,服务器端处理数据并返回结果页面时,将...
综上所述,Struts2提供了多种手段来防止表单的重复提交,开发者可以根据具体的应用场景选择合适的方法。同时,Struts2还具备强大的功能扩展性和灵活性,能够满足复杂应用的需求。通过合理的配置和开发实践,可以有效...
Struts Token机制是一种防止表单重复提交的有效策略,尤其在处理关键操作时,如金融交易或数据修改,防止用户意外或恶意多次点击提交按钮导致的数据重复性问题。下面将详细介绍Struts Token的工作原理、实现方式及其...
在Struts2框架中,防止重复提交是一个重要的安全性考量,因为重复提交可能导致数据不一致性和资源浪费。在上述描述中,给出了三种主要方法来解决这个问题: 1) **使用 `<s:token>` 标签** Struts2 提供了一个称为 ...
综上所述,Struts框架通过Token机制有效地解决了表单重复提交的问题,提供了更健壮的Web应用安全性。正确理解和应用这一机制对于Java Web开发者来说至关重要。在实际项目中,结合其他防御策略,如CSRF防护,可以...