Struts2使用Token避免表单重复提交(十三)上

简介: Struts2使用Token避免表单重复提交(十三)

一.为什么要进行表单验证


在实际开发和生活中,当我们在一个表单填写好数据,进行提交时,如果这个时候网卡,我们一般会再次,甚至是多次点击提交按钮(以为这样会快),也有的会先将浏览的页面返回到上一步,再进行退回,或者重复点击回车, 这样会导致数据重复提交。


为了防止表单重复提交,可以在客户端进行简单的处理,可以在服务器端进行处理。


这里只说明在服务器端进行的处理。


如果想了解客户端处理的,可以观看孤傲苍狼前辈的博客:https://www.cnblogs.com/xdp-gacl/p/3859416.html


二 搭建Struts2的基本运行环境,演示重复提交


二.一 创建UserAction


里面有常用的五个方法。


package com.yjl.web.action;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionSupport;
/**
* @author 两个蝴蝶飞
* @version 创建时间:2018年9月14日 下午6:35:10
* 演示重复提交的Action.在添加用户是进行演示
*/
public class UserAction extends ActionSupport {
  private static Logger logger=Logger.getLogger(UserAction.class);
    private static final long serialVersionUID = -4164832837385401186L;
  public String toAddUI(){
    logger.info("跳转到添加学生的页面");
    return "addUI";
  }
  public String add(){
    logger.info("执行添加学生的操作");
    return "toList";
  }
  public String toEditUI(){
    logger.info("跳转到添加学生的页面");
    return "editUI";
  }
  public String edit(){
    logger.info("执行修改学生的操作");
    return "toList";
  }
  public String delete(){
    logger.info("执行删除学生的操作");
    return "toList";
  }
  public String list(){
    logger.info("执行查询学生的操作");
    return "list";
  }
}


二.二 配置struts.xml文件


<package name="user" namespace="/" extends="struts-default">
    <action name="User_*" class="com.yjl.web.action.UserAction" method="{1}">
      <result name="addUI">/WEB-INF/content/add.jsp</result>
      <result name="editUI">/WEB-INF/content/edit.jsp</result>
      <result name="list">/WEB-INF/content/list.jsp</result>
      <!-- 应该当添加成功之后,就跳转到List界面 -->
      <result name="toList" type="chain">User_list</result>
    </action>
</package>


二.三 编写前端页面


二.三.一 编写 /content/add.jsp 页面


<body>
  <h3>这是一个添加学生的页面</h3>
  <s:form action="User_add" method="post" namespace="/">
    <s:textfield label="姓名" name="name"></s:textfield>
    <s:submit value="添加学生"/>
  </s:form>
</body>


二.三.二 编写 /content/edit.jsp 页面


<body>
  <h3>这是一个修改学生的页面</h3>
  <s:form action="User_edit" method="post" namespace="/">
    <s:textfield label="姓名" name="name"></s:textfield>
    <s:submit value="添加学生"/>
  </s:form>
</body>


二.三.三 编写 /content/list.jsp 页面


<body>
  <h3>这是一个显示学生的页面</h3>
</body>


二.四 重启服务器,运行程序


输入网址: http://localhost:8080/Struts_Token/User_toAddUI


20200414183732675.png


当输入名字之后 ,


点击添加学生之后:


日志栏:


20200414183739824.png


页面上会显示:


20200414183745809.png


下面会显示学生的信息,


注意此时上面的地址栏是:User_add.action。


二.五 出现的问题


  1. 此时如果用户将光标定位到地址栏, 继续点击回车的话,还会继续执行一遍add()的方法:


20200609120844113.png


2.如果用户刷新浏览器的话,也会继续执行一遍add()的方法:


20200609120854997.png


会发现根本原因主要是地址栏的原因。地址栏的地址仍然是 User_add.action, 而不是 User_list.action


需要在 struts.xml中配置时type类型的值。


二.六 将类型type改成redirectAction


将toList 的返回类型,由默认的 chain改成redirectAction。


<!--错误的用法:<result name="toList" type="chain">User_list</result>-->
<result name="toList" type="redirectAction">User_list</result>


二.七 修改后重新验证


点击添加学生按钮:


20200609120909196.png


再次点击回车按钮时:


2020060912092181.png


刷新浏览器时:


20200609120932166.png


都只是执行list()的方法,并不会再次执行add()的方法。

相关文章
|
7月前
|
JavaScript 前端开发 数据安全/隐私保护
提交表单与验证表单案例
提交表单与验证表单案例
57 0
|
NoSQL Java 数据库
SpringBoot实现表单重复提交检测
在实际开发过程中,web应用经常会出现网络延迟,接口处理时间略长,用户习惯等原因造成的客户连续多次点击提交按钮调用接口,导致数据库会出现重复数据或这接口业务逻辑bug等问题
96 0
|
设计模式 JavaScript 数据库
表单防止重复提交的四种方式
表单防止重复提交的四种方式
329 0
|
前端开发 Java 数据安全/隐私保护
3-SpringSecurity:自定义Form表单
3-SpringSecurity:自定义Form表单
153 0
3-SpringSecurity:自定义Form表单
Struts2使用Token避免表单重复提交(十三)下
Struts2使用Token避免表单重复提交(十三)
209 0
Struts2使用Token避免表单重复提交(十三)下