Struts2學(xué)習(xí)筆記 | 防止表單重復(fù)提交及自定義攔截器

表單重復(fù)提交的概述

  • 若刷新表單頁(yè)面客税,再提交表單不算重復(fù)提交惨恭。

  • 若是重定向系草,已經(jīng)提交成功后再刷新不算重復(fù)提交通熄。

  • 以下幾種情況算是表單重復(fù)提交
    多次點(diǎn)擊提交按鈕
    已經(jīng)提交成功,按"回退"之后找都,再點(diǎn)擊"提交按鈕"
    在控制器響應(yīng)頁(yè)面的形式為轉(zhuǎn)發(fā)情況下唇辨,若已經(jīng)提交成功,然后點(diǎn)擊"刷新"

  • 重復(fù)提交的缺點(diǎn)
    加重了服務(wù)器的負(fù)擔(dān)
    可能導(dǎo)致錯(cuò)誤操作

Struts2解決表單重復(fù)提交

  • <s:form >標(biāo)簽中添加<s:token>子標(biāo)簽
    生成一個(gè)隱藏域
    session添加一個(gè)屬性值
    隱藏域的值和session的屬性值是一致的

  • 使用TokenTokenSession攔截器
    這兩個(gè)攔截器均不在默認(rèn)的攔截器棧中能耻,所以需要手工配置一下
    若使用Token攔截器赏枚,則需要配置一個(gè)token.validresult
    若使用TokenSession攔截器,則不需要配置任何其它的result

  • TokenTokenSession區(qū)別
    都是解決表單重復(fù)提交問(wèn)題晓猛,但是使用token攔截器會(huì)轉(zhuǎn)到token.valid這個(gè)result饿幅,使用tokenSession攔截器則還會(huì)響應(yīng)那個(gè)目標(biāo)頁(yè)面,但不會(huì)執(zhí)行tokenSession的后續(xù)攔截器戒职。

  • 可以使用<s:actionerror>標(biāo)簽來(lái)顯示重復(fù)提交的錯(cuò)誤消息栗恩,該錯(cuò)誤消息可以在國(guó)際化資源文件中覆蓋,該字段名為struts.messages.invalid.token洪燥,可以在struts-messages.properties文件中找到摄凡。

使用token攔截器的配置示例:

<action name="testToken" class="com.cerr.struts2.TokenAction">
            <interceptor-ref name="token"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result>/success.jsp</result>
            <result name="invalid.token">/token-error.jsp</result>
</action>

在token-error.jsp中打印錯(cuò)誤消息:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%--
  Created by IntelliJ IDEA.
  User: 白菜
  Date: 2019/8/7
  Time: 21:25
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <s:actionerror></s:actionerror>
</body>
</html>


Struts2攔截器概述

  • 攔截器在訪問(wèn)某個(gè)Action方法之前或之后實(shí)施攔截

  • 攔截器是可拔插的,攔截器是AOP的一種實(shí)現(xiàn)蚓曼。

  • 攔截器棧將攔截器按一定的順序聯(lián)結(jié)成一條鏈,在訪問(wèn)被攔截的方法時(shí)钦扭,Struts2攔截器鏈中的攔截器就會(huì)按其之前定義的順序被依次調(diào)用纫版。

  • 攔截器的調(diào)用流程


    調(diào)用攔截器的流程

Interceptor接口

  • Struts會(huì)依次調(diào)用為某個(gè)Action而注冊(cè)的每一個(gè)攔截器的intercept方法

  • 每次調(diào)用intercept方法時(shí),Struts會(huì)傳遞一個(gè)ActionInvocation接口的實(shí)例

  • ActionInvocation代表一個(gè)給定ActionAction的執(zhí)行狀態(tài)客情,攔截器可以從該類(lèi)的對(duì)象里獲得與該Action相關(guān)聯(lián)的Action對(duì)象和Result對(duì)象其弊,在完成攔截器自己的任務(wù)之后,攔截器將調(diào)用ActionInvocation對(duì)象的invoke方法前進(jìn)到Action處理流程的下一個(gè)環(huán)節(jié)

  • AbstractInterceptor類(lèi)實(shí)現(xiàn)了Interceptor接口膀斋,并為init梭伐,destory提供了一個(gè)空白的實(shí)現(xiàn)。

自定義攔截器

  • 定義一個(gè)攔截器的類(lèi)
    可以實(shí)現(xiàn)Interceptor接口
    也可以繼承AbstractInterceptor抽象類(lèi)

  • struts.xml文件中配置

  • 注意:在自定義的攔截器中可以選擇不調(diào)用ActionInvocationinvoke()方法仰担,那么后續(xù)的攔截器和Action方法將不會(huì)被調(diào)用糊识。Struts2會(huì)渲染自定義攔截器intercept方法返回值對(duì)應(yīng)的result

示例:
定義攔截器類(lèi)myInterceptor:

package com.cerr.struts2.interceptors;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class myInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        System.out.println("調(diào)用actionInvocation.invoke之前");
        String result = actionInvocation.invoke();
        System.out.println("調(diào)用actionInvocation.invoke之后");
        return result;
    }
}

配置及使用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
    <package name="default" namespace="/" extends="struts-default">
      <interceptors>
            <!-- 配置-->
            <interceptor name="hello" class="com.cerr.struts2.interceptors.myInterceptor"></interceptor>
       </interceptors>
     
        <action name="testToken" class="com.cerr.struts2.TokenAction">
            <!-- 使用-->
            <interceptor-ref name="hello"></interceptor-ref>
            <interceptor-ref name="token"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result>/success.jsp</result>
            <result name="invalid.token">/token-error.jsp</result>
        </action>
    </package>
</struts>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赂苗,更是在濱河造成了極大的恐慌愉耙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌滋,死亡現(xiàn)場(chǎng)離奇詭異朴沿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)败砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)赌渣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人昌犹,你說(shuō)我怎么就攤上這事坚芜。” “怎么了祭隔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵货岭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我疾渴,道長(zhǎng)千贯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任搞坝,我火速辦了婚禮搔谴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桩撮。我一直安慰自己敦第,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布店量。 她就那樣靜靜地躺著芜果,像睡著了一般。 火紅的嫁衣襯著肌膚如雪融师。 梳的紋絲不亂的頭發(fā)上右钾,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音旱爆,去河邊找鬼舀射。 笑死,一個(gè)胖子當(dāng)著我的面吹牛怀伦,可吹牛的內(nèi)容都是我干的脆烟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼房待,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邢羔!你這毒婦竟也來(lái)了驼抹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤张抄,失蹤者是張志新(化名)和其女友劉穎砂蔽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體署惯,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡左驾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了极谊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡右。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轻猖,靈堂內(nèi)的尸體忽然破棺而出帆吻,到底是詐尸還是另有隱情,我是刑警寧澤咙边,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布猜煮,位于F島的核電站,受9級(jí)特大地震影響败许,放射性物質(zhì)發(fā)生泄漏王带。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一市殷、第九天 我趴在偏房一處隱蔽的房頂上張望愕撰。 院中可真熱鬧,春花似錦醋寝、人聲如沸搞挣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)囱桨。三九已至,卻和暖如春嗅绰,著一層夾襖步出監(jiān)牢的瞬間蝇摸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工办陷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人律歼。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓民镜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親险毁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子制圈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容