java Struts2防止表單重複提交代碼

來源:互聯網
上載者:User

先要配置攔截器,攔截器用於控制重複提交內容!其實原理很簡單,就是在表單內產生一個序列,判斷是否為新的序列,如果是之前的序列,則證明是一個重複提交內容!

 代碼如下 複製代碼

<?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="common" extends="struts-default" namespace="/common">     
        <interceptors>
            <interceptor-stack name="loginStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="token"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="loginStack"></default-interceptor-ref>
        <action name="loginAction_*" class="loginAction" method="{1}">
            <result name="success">/welcome.jsp</result>
            <result name="invalid.token" type="redirect">/index.jsp</result>
            <result name="input"  type="redirect">/index.jsp</result>
        </action>
    </package>   
</struts>

注意:

如果你不引用:

 代碼如下 複製代碼

<interceptor-ref name="defaultStack"></interceptor-ref>那麼你的後台就不能再接收到參數。

<result name="invalid.token" type="redirect">/index.jsp</result>
<result name="input"  type="redirect">/index.jsp</result>

這兩個返回你一定要配置!一個是重複提交的處理,一個是沒有表單標記時的處理!

JSP中增加Struts標籤的引用

 代碼如下 複製代碼

<%@taglib prefix="s" uri="/struts-tags" %>在表單內增加一個標記:

<s:form action="" name="form1" method="post">
<s:token></s:token>
</s:form>

頁面上會看到輸出兩個隱藏欄位:

 代碼如下 複製代碼

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

上面說了很多可能還有朋友不理解,下面我來舉個執行個體


struts.xml設定檔

 代碼如下 複製代碼

<?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>
      <!-- 預設的視圖主題 -->
    <constant name="struts.ui.theme" value="simple" />

    <!-- struts2在防止表單重複提交的攔截中有2個,分別是:token,tokenSession。tokenSession繼承token而來。
          通常情況下,使用tokenSession用戶端感覺會比較友好。 -->
    <!-- 如果重複提交,會跳轉到error.jsp頁面 -->
    <package name="person" namespace="/test" extends="struts-default">
        <action name="token" class="com.ljq.action.PersonAction">
            <interceptor-ref name="defaultStack" />
            <interceptor-ref name="token" />
            <!-- 如果重複提交,跳轉到error.jsp頁面 -->
            <result name="invalid.token">/WEB-INF/page/error.jsp</result>
            <result>/WEB-INF/page/message.jsp</result>
        </action>
        <action name="tokenSession" class="com.ljq.action.PersonAction">
            <interceptor-ref name="defaultStack" />
            <interceptor-ref name="tokenSession" />
            <!-- 如果重複提交,不會跳轉到error.jsp頁面 -->
            <result name="invalid.token">/WEB-INF/page/error.jsp</result>
            <result>/WEB-INF/page/message.jsp</result>
        </action>
    </package>
</struts>   

PersonAction類

 代碼如下 複製代碼


package com.ljq.action;


import java.util.ArrayList;
import java.util.List;

public class PersonAction {
   
    private String name;

    @SuppressWarnings("unchecked")
    //觀看控制台
    //如果token生效則不會在控制台輸出name的值,而會輸出如下警告: 2011-3-14 20:45:32 com.opensymphony.xwork2.util.logging.commons.CommonsLogger
    //warn 警告: Form token EDZ4S96RNDN5VD8B1CQTK6FTHIJUPC66 does not match the session token null.
    public String execute() {
        List ls = new ArrayList();
        ls.add(name);
        for (int i = 0; i < ls.size(); i++) {
            System.out.println(ls.get(i));
        }
        return "success";
    }
   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

index.jsp表單頁面

 代碼如下 複製代碼


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   
    <title>防止表單重複提交</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">  
  </head>
 
  <body>
      <!-- 防止表單重複提交,記得在form表單裡填上<s:token></s:token>      -->
      <!-- action="token"、action="tokenSession" -->
      <s:form action="token" namespace="/test" method="post">
          姓名:<s:textfield name="name"/><s:token></s:token>
          <input type="submit" value="發送"/>
      </s:form>
  </body>
</html>

message.jsp返回成功頁面

 代碼如下 複製代碼

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
   
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">  
  </head>
 
  <body>
     <s:property value="name"/><br/>
     <%=new Date() %>
  </body>
</html>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.