最近开发中涉及到了表单重复提次的问题,通过研究做个总结。

防止表单重复提交主要用的到标签是<s: token />,拦截器 <interceptor-ref name="token" />,还有一个默认的返回值<result name="invalid.token">/input.jsp</result>

在页面加载时,<s: token />产生一个GUID(Globally Unique Identifier,全局唯一标识符)值的隐藏输入框如:

<input type="hidden" name="struts.token.name" value="struts.token"/>
<input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"/>

同时,将GUID放到会话(session)中;在执行action之前,“token”拦截器将会话token与请求token比较,如果两者相同,则将会话中的token删除并往下执行,否则向actionErrors加入错误信息。如此一来,如果用户通过某种手段提交了两次相同的请求,两个token就会不同。

以下为action代码

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {   
    private static final long serialVersionUID = 6820659617470261780L;
   
    private String message;
       
    public String getMessage() {
        return message;
    }

public void setMessage(String message) {
        this.message = message;
    }
   
    @Override
    public String execute() {
        System.out.println("Executing action, your message is " + message);
        return 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 XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>struts2 test token</title>
    <s:head />
</head>
<body>    
    <s:actionerror />
    <s:form action="testAction" >
        <s:textfield name="message" label="Message" />
        <s:token />   <%-- 注意这里--%>
        <s:submit />
    </s:form>
</body>
</html>

下面是struts2的配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <package name="test" extends="struts-default" namespace="/testToken">
        <action name="test" class="com.fhx.TestAction">
             <result name="invalid.token">/input.jsp</result>                        
            <result>/input.jsp</result>

<interceptor-ref name="defaultStack" />
           <interceptor-ref name="token" />

</action>
    </package>
</struts>

以上XML片段值注意的是加入了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话token与请求token不一致时,将会直接返回“invalid.token”结果。

Struts2防止表单重复提交相关推荐

  1. 使用Struts2防止表单重复提交

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

  2. struts2 防止表单重复提交--令牌机制

    jsp: action: 配置文件: 转载于:https://www.cnblogs.com/hwgok/p/8324432.html

  3. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  4. Struts2框架学习之七:避免表单重复提交

    前言 防止表单重复提交在web开发中是一个经常遇到的问题,一般来避免重复提交有两种方式:客户端JavaScript代码实现和服务端代码实现.这里主要介绍服务端的实现方式.在服务端实现表单重复提交的基本 ...

  5. struts2 自带的 token防止表单重复提交拦截器

    在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name=&quo ...

  6. Struts2学习笔记(十八) 防止表单重复提交

    概述 有些时候,我们在想某个网页提交了信息之后,由于某些原因,我们会重复点击提交,或者刷新页面,或者是在提交页面呈现之后点击后退按钮,从而导致这些表单数据被重复提交.在大多数情况下我们是不希望这种情况 ...

  7. Sturt2做表单重复提交

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-/ ...

  8. java 防止表单重复提交

    防止表单重复提交,或者是防止按F5 刷新提交表单. 在WEB开发中是经常会碰到这样的问题的. 目前主流的解决方法有以下三种: 1.采用脚本来解决 2.重定向到别的页面 3.使用s:token 标签 由 ...

  9. springboot 订单重复提交_Spring Boot (一) 校验表单重复提交

    一.前言 在某些情况下,由于网速慢,用户操作有误(连续点击两下提交按钮),页面卡顿等原因,可能会出现表单数据重复提交造成数据库保存多条重复数据. 存在如上问题可以交给前端解决,判断多长时间内不能再次点 ...

最新文章

  1. linux select系统调用函数分析,Linux select系统调用
  2. 世界地球日主题班会PPT教学课件模板
  3. Spring 源码讲解:bean 的创建流程 - 公开课笔记
  4. Go 语言实现 23 种设计模式适配器
  5. AngularDart4.0 指南- 表单
  6. 限定概率抽奖_守护星已点亮,内测皮肤得到没?从天美抽奖概率分析:地址什么梗...
  7. 安装TPCC-MySQL报错
  8. (9)Zynq UART控制器介绍
  9. DAC+DMA+TIM实现音频播放问题记录
  10. PHP中的正则表达式函数
  11. DEVC++中的 “万能头文件” <bits/stdc++.h>
  12. 以太网协议号字段定义
  13. 微软应用商店安装包_微软苦恼了!微博UWP客户端停止服务:大家都用浏览器去了?...
  14. 温湿度传感器的工作原理及应用领域你了解多少呢
  15. 表白公式计算机,【理工男表白公式大全】_理工男写“公式体”情书表白图
  16. SylixOS -- KN_SMP_WMB()内存屏障函数解析
  17. ICPC冠军教练亲自授课 字节跳动ICPC冬令营全球招募50支受训队
  18. 听说写面经能赞RP·······
  19. Linksys WRT54G 无线路由器刷机DD-WRT成功
  20. (centos7-x86)编译安装zabbix6.0LTS+Mariadb10.5+Apache+php7.4【安装完整版】

热门文章

  1. new Integer 和 Integer.valueOf 有什么不同
  2. ecshop 首页添加某个分类下面的商品
  3. JAVA构造方法,继承关系和SUPER关键字
  4. legend3---4、lavarel中session使用注意
  5. html和css入门 (三)
  6. WPF里ItemsControl的分组实现
  7. 关于vmware workstation10常见问题
  8. 我总结的js性能优化的小知识
  9. 网易笔试——混合颜料
  10. 类型、值和变量(一)