`

struts2第二回:防止重复提交

    博客分类:
  • J2EE
阅读更多
基本原理:用户访问做了重复提交的页面,服务器会生成一个令牌,这个令牌一方面以隐藏字段的方式存于页面上。另一方面保存与session中,当用户第一次提交信息时,服务端会拿页面上得同session里的作对比,相同则通过,并清空session中的值。
这样,当第二次提交该页面时,页面上得值与session中的就不一样了,这样便会返回input,提示重复提交了。
========下面是token.jsp代码==========
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>struts2防止重复提交</title>

</head>
<body>
<s:actionerror cssStyle="color:red" /> <!--重复提交的提示信息-->   
<s:form action="doToken.action">
<s:textfield name="userName" ></s:textfield><br/>
<s:token /> <!--保存本次token信息-->   
<s:submit></s:submit>
</s:form>
</body>
</html>

========下面是struts.xml代码==========
		<!--struts2防止重复提交:拦截器是action级别的,一旦配置该action下得所有请求都会经过此过滤器 -->
		<action name="doToken" class="com.TokenTestAction" method="doToken">
			<result name="invalid.token">/token.jsp</result>
			<interceptor-ref name="defaultStack" /><!--如果自己加入了其他拦截器,则必须手动添加此拦截器,否则在action中会取不到表单的值-->
			<interceptor-ref name="token"/>
		</action>


========下面是TokenTestAction.java代码==========
package com;

import com.opensymphony.xwork2.ActionSupport;

public class TokenTestAction extends ActionSupport {
	private String userName;
	
	 public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String doToken()
	 {
		 System.out.println("提交成功了!输入的名字是:"+userName);
		 
		 return SUCCESS;
	 }
}



这样的话所展示出来的是默认的提示信息:
The form has already been processed or no token was supplied, please try again.
因为在struts-core.jar中可以找到struts-message.properties
之中有:
struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.的配置,也就是默认的提示信息。

但我们在用的时候肯定是要用自己定义的提示信息,配置的步骤如下:
在src下加入:
==========struts.properties==========
#国际化文件
struts.custom.i18n.resources=messageResources
#(这个是资源文件的前缀,如果要是有文件目录就这样写xxxx.xxx...messageResources)

=========messageResources_zh_CN.properties====
#messageResources_zh_CN.properties
#国际化编码方式: 从dos 进入进行编码可格式如:natice2ascii -encoding UTF-8 文件的全限路径+文件名 输出文件地址
#编过码的文件如:username=\u7528\u6237\u540d  是标准的UNICODE编码,将其拷贝到本文件中。
struts.messages.invalid.token = \u5bf9\u4e0d\u8d77\uff0c\u4e0d\u80fd\u91cd\u590d\u63d0\u4ea4

这里的\u5bf9\u4e0d\u8d77\uff0c\u4e0d\u80fd\u91cd\u590d\u63d0\u4ea4是我将"请不要重复提交"转码过来的。
这样的话,表单页面展示的信息将会变成"请不要重复提交"。

注意:这种防止重复提交是保存在session中,分布式环境下的web应用可能就不适用了。

工程结构图如下:



  • 大小: 55 KB
4
1
分享到:
评论
1 楼 hbxflihua 2011-10-18  
struts2的重复提交,一直没用好。有时间教教我。建议楼主整个压缩文件。

相关推荐

    Struts2 in action中文版

    15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5 完成CRUD操作的一个动作 317 15.5.1 CRUD 317 15.5.2 拦截器和接口 318 ...

    深入浅出Struts2

    Struts 2 是Java Web 应用首选的MVC 框架。本书对Struts 2 的工作机理进行了透彻的阐述。书中介绍了如何利用...第15章 防止重复提交 第16章 调试与性能分析 第17章 进度条 第18章 定制拦截器 第19章... [显示全部]

    struts2 详解文档

    介绍Struts 2及Struts 2开发环境的搭建 第一个Struts 2应用开发 解决Struts 2配置文件无提示问题 Action名称的搜索顺序 ...使用标签防止表单重复提交 Struts 2+Spring 2.5+Hibernate 3.3整合开发

    深入浅出Struts2(附源码)

    第15章防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    第15章 防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章 调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 ...

    structs程序设计从入门到精通word文档

    9.3 Struts令牌机制,防止重复提交 13 9.4 StrutsAction单态陷阱,请谨慎使用全局变量 13 9.5 Struts异常处理 13 第10章 struts中使用国际化(i18n) 13 10.1 struts国际化程序尝试 13 10.1 Java对i18n的支持 14 10.1...

    达内java培训目录

    Struts2 Struts2核心控制流程、Ognl、Action、Interceptor、Result、FreeMarker、Struts2标记库、Struts2扩展、Struts2应用技巧(输入验证、消息国际化、文件上传和下载、防止重复提交等)。 熟练掌握Struts2核心...

Global site tag (gtag.js) - Google Analytics