zoukankan      html  css  js  c++  java
  • Struts(二十七):使用token或tokenSession防止表单重复提交

    • 什么是表单重复提交

    表单重复提交包括以下几种情况:

      前提:不刷新表单页面

      1、多次点击“提交”按钮后,重复提交了多次;

      2、已经提交成功之后,按“回退”按钮之后,在点击“提交”按钮后,提交成功;

      3、在控制页面响应的形式为“转发”的情况下,若已经提交成功,然后点击“刷新(F5)”按钮后,再次提交成功。

    哪些操作不属于重复提交操作?

      1、若刷新了表单页面,再提交表单不算重复提交;

      2、若使用的是redirect的响应类型,已经提交成功后,在点击“刷新(F5)”按钮,不是表单的重复提交操作。

    • struts2使用token或tokenSession防止表单重复提交

    第一步:需要再表单s:from中添加一个s:token子标签

      1、添加了s:token子标签之后,会在页面中自动生成一个隐藏域;

      2、在session中会添加一个属性值;

      3、页面隐藏域的值与session的属性值是一致的。 

      <s:form action="testToken">
            <s:token></s:token>
            <s:textfield name="username" label="UserName"></s:textfield>
            <s:password name="password" label="Password"></s:password>
            <s:submit label="Submit"></s:submit>
        </s:form>

    第二步:使用token或者tokenSession拦截器

      1、这两个拦截器都不在默认拦截器栈中,所以在使用时需要在页面手动配置;

      2、如果使用token拦截器,需要配置一个名字为invalid.token的result;

            <action name="testToken" class="com.dx.struts2.actions.MemberAction">
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <result>/success.jsp</result>
                <result name="invalid.token">/tokenError.jsp</result>
            </action>

      3、如果使用tokenSession拦截器,不需要配置任何额外的result。

            <action name="testToken" class="com.dx.struts2.actions.MemberAction">
                <interceptor-ref name="tokenSession"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <result>/success.jsp</result>
            </action>

    备注:

    token与tokenSession的区别

    1)相同点:都是为解决struts2中防止表单重复提交而生;

    2)不同点:使用token拦截器,如果发生重复提交时,页面会自动跳转到invalid.token的这个result页面;使用tokenSession拦截器时,依然会响应目标页面,但不会执行tokenSession之后的拦截器,就像什么都没有发生一样。

     针对token方式,我们可以在tokenError.jsp页面接收操作信息,使用s:actionerror标签

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        Token Error
        <s:actionerror />
    </body>
    </html>

    而且,我们也可以在国际化文件中配置对应的操作信息。

    修改struts.xml添加constant变量:

    <constant name="struts.custom.i18n.resources" value="i18n"></constant>

    在i18n.properties文件添加国际化信息:

    struts.messages.invalid.token=~~The form has already been processed or no token was supplied, please try again.
    #jar struts-core.jar 
    #package org.apache.struts2
    #filename struts-message.properties
  • 相关阅读:
    从.Net迁移到.Net Core时,需要注意的兼容性变更
    P/Invoke各种总结(五、在C#中使用指针类型)
    P/Invoke各种总结(四、平台调用时的数据类型对应)
    解决Visual Studio 2017/2019 "const char *"类型的值不能用于初始化"char *"类型的实体的问题
    .Net Framework、.Net Core和.Net Standard的区别
    C#代码分析工具Style Cop使用
    《代码不朽:编写可维护软件的10大要则(C#版)》读书笔记
    Visual C++中宽字节与多字节字符互相转换的方法
    浮动和定位
    关于如何设置图片大小和图片形状
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/6699185.html
Copyright © 2011-2022 走看看