struts2第二回:防止重复提交

基本原理:用户访问做了重复提交的页面,服务器会生成一个令牌,这个令牌一方面以隐藏字段的方式存于页面上。另一方面保存与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应用可能就不适用了。

工程结构图如下:
[img]http://dl.iteye.com/upload/attachment/569774/d56d8c52-69de-3b5a-9a5c-6c6037b42764.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值