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()的方法。

相关文章
|
弹性计算 运维 监控
ECS事件告警
ecs事件告警
499 2
|
Java 应用服务中间件
VsCode 运行Java Web 项目(Tomcat)
使用VsCode 运行Java Web 项目(Tomcat)
3180 0
VsCode 运行Java Web 项目(Tomcat)
|
SQL Oracle 关系型数据库
浅谈mysql数据库迁移至国产化达梦数据库
项目要求mysql数据库数据需要转到达梦数据库,对于达梦数据库的了解尚且不多,一开始使用手动转SQL脚本,效率极低,非常容易出错。达梦数据库的资料实在有限,经过后期研究,发现原来DM已经有自己的数据迁移工具,使用之后非常方便。对mysql数据库转达梦数据库的操作流程做一个简要分享。
6892 0
浅谈mysql数据库迁移至国产化达梦数据库
|
IDE Java 程序员
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
本文提供了如何使用学生邮箱免费获取并安装JetBrains全家桶(包括IDEA、PyCharm等)的详细教程,涵盖了学生认证、软件下载、安装及常见问题的解决方法。
4402 0
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
|
11月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
2609 82
|
10月前
|
人工智能 自然语言处理 程序员
在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
5221 15
|
SQL 缓存 关系型数据库
MySQL高级篇——性能分析工具
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long-query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。它的主要作用是,帮助我们发现那些执行时间特别长的 SOL 查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。
MySQL高级篇——性能分析工具
|
开发工具 git Windows
IDEA如何对比不同分支某个文件的差异
【9月更文挑战第28天】该指南介绍了在IDEA中使用Git工具窗口进行分支对比的方法。首先,通过底部工具栏或菜单打开Git窗口;接着,在“Branches”选项卡中查看所有分支;然后选择要对比的分支和文件,并通过右键菜单启动对比;最后,在“Diff”视图中查看详细差异,包括新增和删除内容的颜色标记。此外,还提供了使用内置终端执行`git diff`命令进行对比的可选方法。
2714 4
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
11394 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
|
缓存 Linux
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stoc
CentOS 默认的镜像源可能无法访问。可以更换为其他镜像源,例如阿里云、腾讯云等。
1711 7