• Struts1防止表单重复提交


    package org.zln.struts.action;
    
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Created by sherry on 000020/5/20 20:37.
     */
    public class RegUserUI extends Action {
    
    
        @Override
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
            /*注意,请求页面一定要通过这个Action跳转过去*/
            this.saveToken(request);
            return mapping.findForward("SUCCESS");
        }
    }
    <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
    <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
    <html>
    <head>
        <title>注册用户</title>
    </head>
    <body>
    
        <hr/>
        <html:link action="/local?language=zh">中文</html:link><br/>
        <html:link action="/local?language=en">英文</html:link><br/>
        <hr/>
        <html:errors property="doubleSubmit" header="" footer="" prefix="" suffix=""/>
        <!-- 注意:只有使用html:form生成的表单,才会从session中获取Token -->
        <html:form action="/regUser" method="post">
            <table>
                <caption>注册</caption>
                <tr>
                    <td>用户名</td>
                    <td><html:text property="regUser.username"/><html:errors property="username" header="" footer="" prefix="" suffix=""/> </td>
                </tr>
                <tr>
                    <td>密码</td>
                    <td>
                        <%-- value="" 是为了不回显密码--%>
                        <html:password property="regUser.password" value=""/> <html:errors property="password" header="" footer="" prefix="" suffix=""/>
                    </td>
                </tr>
                <tr>
                    <td>密码确认</td>
                    <td>
                        <html:password property="password2" value=""/><html:errors property="password2" header="" footer="" prefix="" suffix=""/>
                    </td>
                </tr>
                <tr>
                    <td>身高</td>
                    <td>
                        <html:text property="regUser.height"/>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="right">
                        <html:submit titleKey="info.submit"><bean:message bundle="message" key="info.submit"/></html:submit>
                        <html:checkbox property="autoLogin">两周内自动登录?</html:checkbox>
                        <html:cancel>取消</html:cancel>
                    </td>
                </tr>
            </table>
        </html:form>
        <hr/>
    
    </body>
    </html>
    package org.zln.struts.action;
    
    import org.apache.struts.action.*;
    import org.zln.struts.form.RegUserForm;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Created by sherry on 000020/5/20 20:37.
     */
    public class RegUser extends Action {
    
        @Override
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
            ActionMessages errors = new ActionMessages();
            /*进行所有操作之前,先判断表单是否重复提交*/
            if (!isTokenValid(request,true)){//假如Token无效  true表示校验完后将Token从session中清除
                errors.add("doubleSubmit",new ActionMessage("表单重复提交",false));
                this.saveErrors(request,errors);
                return mapping.getInputForward();
            }
            RegUserForm regUserForm = (RegUserForm) form;
            System.out.println("username:"+regUserForm.getRegUser().getUsername()+"
    autoLogin:"+regUserForm.isAutoLogin());
            request.setAttribute("username",regUserForm.getRegUser().getUsername());
            /*业务逻辑校验*/
            if (!"zln".equals(regUserForm.getRegUser().getUsername().trim())){//假设数据库中获取到的用户名是  zln
                errors.add("username",new ActionMessage("用户不存在",false));
                this.saveErrors(request,errors);//request.setAttribute(Globals.ERROR_KEY, errors);
                //return mapping.findForward("FAILURE");
                return mapping.getInputForward();
            }
            return mapping.findForward("SUCCESS");
        }
    }
    
    /*
    因为在打开表单页面之前,会先往session中存放一个Token,
    提交请求的时候,会将隐藏域中的Token作为参数一起提交
    所谓有效的Token,就是session中的Token与表单提交时候的Token值相同,就被视为是一次请求。并且判断完后会将session中的Token清除
    加入用户通过后退再次提交,此时session中的Token已经消失了,所以Token判断就会被视为无效
    */
  • 相关阅读:
    通俗算法教程04
    微软是如何重写C#编译器并使它开源的
    在 CentOS 7 中安装 MySQL 8
    在 .NET Core 中结合 HttpClientFactory 使用 Polly(下篇)
    在 .NET Core 中结合 HttpClientFactory 使用 Polly(中篇)
    .NET 开源项目 Polly 介绍
    在 .NET Core 中结合 HttpClientFactory 使用 Polly(上篇)
    5年后、10年后,你希望自己是个什么样的人?
    即将发布的 ASP.NET Core 2.2 会有哪些新玩意儿?
    推荐六本前端开发必看的书籍
  • 原文地址:https://www.cnblogs.com/sherrykid/p/4573882.html
Copyright © 2020-2023  润新知