JAVA-Struts2防止表單重複提交

好記性不如賴筆頭……

表單重複提交的問題可能大多數開發者都會遇到,在未使用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>

配置完成,啓動項目,訪問結果如下:

這裏寫圖片描述

提交後,頁面提示的內容如下:

這裏寫圖片描述

後臺輸出內容如下:

這裏寫圖片描述

刷新重複提交 後,顯示頁面包括後臺輸出無任何變化,說明防止重複提交成功。

發佈了153 篇原創文章 · 獲贊 69 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章