Struts2_表单重复提交问题

表单重复提交

概述
表单的重复提交:
--在不刷新表单页面的前提下:
    多次点击提交按钮
    已经提交成功,按“回退”之后,再点击“提交”按钮
    在控制器响应页面的形式为转发情况下,若已经提交成功,然后点击“刷新(F5)"

注意:
--若刷新表单页面,再提交表单不算重复提交

--若使用的是redirect的响应类型,已经提交成功后,再点击"刷新",不是表单的重复提交。


重复提交的缺点:
   1. 加重了服务器的负担
   2.可能导致错误的操作


struts2解决表单的重复提交问题:
1.在s:form中添加s:token子标签
>生成一个隐藏域
>在session中添加一个属性值
>隐藏域的值和session的属性值是一致的


2.使用Token或TokenSession拦截器
>这两个拦截器均不在默认的拦截器中,所以需要手工配置一下
>若使用Token拦截器,则需要配置一个token.valid的result
>若使用TokenSession拦截器,则不需要配置任何其他的result


3.Token  VS  TokenSession
>都是解决表单重复提交问题的
>使用Token拦截器会转到token.valid的result
>使用TokenSession拦截器则还会响应那个目标页面,但不会执行TokenSession拦截器的后续拦截器,就像什么都没发生过一样。

4.可以使用s:actionerror标签来显示重复提交的错误消息,该错误消息可以在国际化资源文件中覆盖,该消息可以在struts-messages.properties文件中找到


下面给出范例


struts.xml

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

<struts>

	<constant name="struts.custom.i18n.resources" value="i18n"></constant>
    <package name="default" namespace="/" extends="struts-default">

       <action name="testToken" class="com.wul.app.TokenAction">
           <!-- <interceptor-ref name="token"></interceptor-ref>  --> 
            <interceptor-ref name="tokenSession"></interceptor-ref>
       		<interceptor-ref name="defaultStack"></interceptor-ref>
       		<result>/success.jsp</result>
       		<result name="invalid.token">/token.error.jsp</result>
       </action>
       
       
    </package>


</struts>
i18n.properties

struts.messages.invalid.token=\u56FD\u9645\u5316\u8D44\u6E90\u6587\u4EF6\uFF1AThe form has already been processed or no token was supplied, please try again.

TokenAction.java

package com.wul.app;

import com.opensymphony.xwork2.ActionSupport;

public class TokenAction extends ActionSupport{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private String username;
	
	
	
	
	public String getUsername() {
		return username;
	}




	public void setUsername(String username) {
		this.username = username;
	}




	@Override
	public String execute() throws Exception {
		
		Thread.sleep(2000);
		
		System.out.println("username" + username);
		return SUCCESS;
	}
}

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>Insert title here</title>
</head>
<body>
		
		<s:form action="testToken.action">
			<s:token></s:token>
			<s:textfield name="username" label="Username"></s:textfield>
			<s:submit></s:submit>
		</s:form>

</body>
</html>

token.error.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>Insert title here</title>
</head>
<body>
      <s:debug></s:debug>
      
      error token page
      
      <s:actionerror/>
</body>
</html>

success.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>Insert title here</title>
</head>
<body>
		success
</body>
</html>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值