JAVA-Struts2防止表单重复提交

本文介绍如何使用Struts2框架中的token和tokenSession拦截器来避免表单重复提交的问题。通过示例展示了如何配置拦截器及必要的视图处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好记性不如赖笔头……

表单重复提交的问题可能大多数开发者都会遇到,在未使用Struts2框架之前的解决方案是在进入提交表单页面,将验证码保存在session中,当表单提交时,就会验证 验证码是否存在,如果存在,则删除,通过 验证,如果不存在,则提示重复提交或超时。

Struts2中提供了防止表单提效的拦截器token/tokenSession,他们的作用分别是:

1. token拦截器:如果重复提交会直接返回“No result defined for action com.ckinghan.web.action.RegAction and result invalid.token”提示,须要自己定义”invalid.token”的返回视图。

2. tokenSession拦截器:对于重复提交的表单请求忽略,不做任何处理。

注意,它们使用的前提是,在JSP页面,须要使用s:token标签。

示例如下:

1、创建reSubmit.jsp页面,具体代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>重复提交表单测试</title>
  </head>
  <body>
    <hr>
    <h1>用户注册</h1>
    <s:form action="reg">
        <s:token></s:token>
        <s:textfield name="userName" label="昵称"/>
        <s:password name="password" label="密码"/>
        <s:submit value="注册"></s:submit>
    </s:form>
  </body>
</html>

2、创建RegAction动作类,并继承ActionSupport,具体代码如下:

package com.ckinghan.web.action;

import com.opensymphony.xwork2.ActionSupport;

public class RegAction 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 reg(){
        System.out.println(userName);
        System.out.println(password);

        return SUCCESS;
    }
}

3、创建Struts.xml文件,存储在src目录下,具体配置如下:

<?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.devMode" value="true"/>

    <package name="formReSumbit" extends="struts-default">
            <action name="reg" class="com.ckinghan.web.action.RegAction" method="reg">
            <!--  先执行默认拦截器(如果在这里配置了非默认拦截器,默认拦截器将不在执行,所以在这里将默认拦截器也配置上)  -->
            <interceptor-ref name="defaultStack"/>
            <!--  tokenSession拦截器,对于重复提交的表单不做任何处理  -->
            <interceptor-ref name="tokenSession"/>
            <!--  token拦截器与tokenSession拦截器使用一个就可以了,使用了token拦截器,必须配合“invalid.token”的返回视图  -->
<!--            <interceptor-ref name="session"/> -->
            <result>/success.jsp</result>
            <!-- 配合token拦截器使用 -->
<!--            <result name="invalid.token">/error.jsp</result> -->
        </action>
    </package>

</struts>

4、error.jsp文件的内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>错误提示</title>
  </head>
  <body>
    请勿重复提交
  </body>
</html>

配置完成,启动项目,访问结果如下:

这里写图片描述

提交后,页面提示的内容如下:

这里写图片描述

后台输出内容如下:

这里写图片描述

刷新重复提交 后,显示页面包括后台输出无任何变化,说明防止重复提交成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值