首页 > 其他分享 >Struts2中防止表单重复提交的两种方式

Struts2中防止表单重复提交的两种方式

时间:2023-08-27 11:03:36浏览次数:37  
标签:String 表单 Struts2 提交 Action import password


防止表单重复提交,这是个很重要的知识点,而且很有用。当用户提交了一个表单,此时,地址栏显示的是处理这个表单的Action的地址,若此时刷新,则会重新发送一次表单数据,即又进行了一次提交,若这个Action是用来处理用户注册的,那么重复提交会再一次向数据库中插入之前已经插入的数据,这显然不是我们想要的。有两种方法,可以防止表单重复提交,一种是用Action的重定向,一种是用Session Token(Session令牌)。

第一种方法,Action处理完用户提交的数据后,重定向到另一个Action或是一个页面,使用户提交后,所停留的位置,不是当前处理数据的Action,这样用户再刷新时,就不会再次执行这个Action了,就会避免表单重复提交的问题了。

第二种方法,是一种很经典的处理这个问题的机制。这种方法是在用户要提交的表单中,加入一个<s:token>标签,这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),会生成一个随机的字符串(这个字符串,查看网页的源代码可以看到),并且发送给客户端的浏览器,同时,在服务器中,会把这个随机字符串保存到用户的session对象中。当第一次提交表单时,在服务器中,会比较客户端和服务器中分别保存的这个随机字符串,因为是第一次提交,所以这两个字符串相等,然后进行正常的业务处理。第一次提交后,在服务器中的session中保存的这个随机字符串,会改变为其他的随机值,注意,这是很重要的一步!此时,地址栏停留在处理用户提交数据的Action中,客户端中保存的随机字符串没有改变,若是刷新页面,即重复提交,服务器再进行两个字符串的比较,会不相等,就会跳转到name为invalid.token的结果页面中,这样就会防止表单重复提交了。

第一种方法的举例,在上一篇博客中,这里就不再列出了,这里主要举例说明一下session token的机制:

Login.jsp:

<s:form action="/test/token" theme="simple">
    	username:<s:textfield name="username"></s:textfield><br>
    	password:<s:password name="password"></s:password><br>
    	<s:submit value="submit"></s:submit>
    	<s:token></s:token><!--一定要有这个标签-->
    </s:form>
struts.xml:

<action name="token" class="com.suo.actions.TokenAction">
	 		<result name="success">/WEB-INF/result/LoginResult.jsp</result>
	 		<result name="invalid.token">/WEB-INF/result/TokenFailed.jsp</result>
	 		<!-- 若重复提交,则会跳转到这个页面,注意这里result的名字,一定要是invalid.token -->
	 		
	 		<interceptor-ref name="token"></interceptor-ref>
	 		<interceptor-ref name="defaultStack"></interceptor-ref>
	 		<!-- 这里一定要有这两个拦截器 -->
	 	</action>
TokenAction.java:

package com.suo.actions;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class TokenAction extends ActionSupport {
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute()
	{	
		return SUCCESS;
	}
}


结果页面就不写了




标签:String,表单,Struts2,提交,Action,import,password
From: https://blog.51cto.com/u_5173797/7251451

相关文章

  • struts2模型驱动
    和模型驱动的相对应的是属性驱动,虽然名字叫的挺牛的,其实很好理解。属性驱动就是在Action中,定义的是和表单中对应的一个个属性,然后有属性的get/set方法。而模型驱动就是事先定义了一个模型,即Model,将表单传递过来的数据封装成一个对象后,再传递给Action,这和Struts1的这种机制很相似。......
  • Struts2输入校验以及错误信息处理(2)——用Struts2定义好的校验框架进行校验
    Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。不管是哪种方式,程序执行的流程都是一样的,执行流程如下:1、对表单传递过来的数据,先进行类型转换......
  • Struts2的自定义类型转换和简单的输入校验
    这里关键是对自定义类型的理解,它和8个基本数据类型的地位是一样的,只不过这个是你自己定义的类型。那么在Struts2中什么时候要用到数据类型转换呢?其实,我们一直在用,只是我们没有感觉到而已,Struts2对8个基本数据类型以及Date、String等常见类型,会自动的用内建的类型转换器进行转换,这个......
  • Struts2输入校验以及错误信息处理(1)——用Action中定义的validate()方法进行校验
    Struts2的输入校验有两种方式:一种是用Action中定义的validate()方法进行校验,一种是用Struts2定义好的校验框架进行校验。前者里面的逻辑判断要自己写,而后者只需要传递相应的参数即可。不管是哪种方式,程序执行的流程都是一样的,执行流程如下:1、对表单传递过来的数据,先进行类型转换2、......
  • struts2文件上传
    上传文件其实分为两个步骤:首先,将客户端传递过来的文件保存到struts.multipart.saveDir键所指定的目录下,如果没有指定,那么就保存到javax.servlet.context.tempdir环境变量所指定的目录下,然后,Action中所定义的成员变量file,实际指向的是临时目录中的临时文件,在服务器通过IO的方式,将临......
  • struts2异常处理
    Struts2中的异常处理有两种形式:一种是局部异常处理,一种是全局异常处理在struts.xml中的package下有两个这样的标签:<global-exception-mappings>和<global-results>,前者指定异常处理的类,后者是异常处理结果,通常指定一个显示异常信息的页面。而在action中,也有类似全局的异常处理,<exce......
  • 给微软.Net runtime运行时提交的几个Issues
    前言因为目前从事的CLR+JIT,所以会遇到一些非常底层的问题,比如涉及到微软的公共运行时和即时编译器或者AOT编译器的编译异常等情况,这里分享下自己提的几个Issues。原文:微软.Netruntime运行时提交的几个IssuesIssues一.issuesone第一个System.Numerics.Vector库里面的成员......
  • Tita 升级|便捷查看「我的/ta 的」总结提交情况
    一、单人提交情况看板的查看Tita-OKR和新绩效一体化管理平台无论是在「我的总结」中查看自己的总结提交,还是单独查看下属、共享人、或者是搜索某一位同事进行总结的查看,都会在页面右侧看到这个人总结提交情况的统计看板,在看板中可以看到这一员工是否提交了总结,是按时提交还是......
  • vue+element根据表单中选项切换,更改表单验证规则
    表单:<el-form-itemlabel="周期间隔(天)"prop="periodSpace"v-if="isServicePeriod"><el-inputv-model="form.periodSpace"type="number"placeholder="请输入周期间隔(天)"/></el-form-item>data:......
  • Spark任务提交到Yarn状态一直是Accepted
    现象今天提交Spark任务到Yarn集群,但是任务状态一直是Accepted:23/08/2514:59:55INFOClient:Applicationreportforapplication_1692971614101_0018(state:ACCEPTED)原因前端时间也遇到这个问题,是因为Yarn集群健康节点是0,不健康的节点点进详情显示:1/1local-......