• 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
  • 相关阅读:
    盒子模型2+浮动
    盒子模型
    CSS背景和精灵图
    线程间的通信的实现
    操作系统中线程与进程
    java中的互斥锁和信号量的区别
    Java中的常见异常
    JVM面试问题
    软件测试分类
    软件测试
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/6699185.html
Copyright © 2020-2023  润新知