当前位置: 首页 > 知识库问答 >
问题:

Javascript表单提交两次

鲁鸿朗
2023-03-14

我有一个登录表单,它与Firebase auth一起工作,并连接到servlet。问题是它被提交了两次。请查看以下内容。

JavaScript代码

function toggleSignIn() 
{
    if (firebase.auth().currentUser) 
    {
                    // [START signout]
                    //window.location.href = 'LoadSellPendingApprovals'
                    alert('existing user');
                    firebase.auth().signOut();
                    // [END signout]
                } else {
                    var email = document.getElementById('email').value;
                    var password = document.getElementById('password').value;
                    if (email.length < 4) {
                        alert('Please enter an email address.');
                        return;
                    }

                    if (password.length < 4) {
                        alert('Please enter a password.');
                        return;
                    }

                    // Sign in with email and pass.
                    // [START authwithemail]
                    firebase.auth().signInWithEmailAndPassword(email, password).then(function(firebaseUser) 
                    {
                        var email = firebase.auth().currentUser.email;
                        //alert(email);
                        // console.log(email) contains email
                        const options = {
                            method: 'POST',
                            //url: 'LoginValidator',
                            headers: {
                                // set appropriate headers, assuming json here
                                //"Content-Type": "application/json",
                                 "Content-Type": "application/x-www-form-urlencoded"
                            },
                            // form body, assuming json
                            //body: JSON.stringify(email)
                             body: `email=${email}`
                        }
                        alert(email);
                         url = 'LoginValidator'
                        fetch(url, options)
                            .then(response => response.json())
                            .then(data => console.log(data))
      .                     catch(e => console.error(e))
                            window.location.href = 'LoginValidator'
                    })

                    .catch(function(error) 
                    {
                        // Handle Errors here.
                        var errorCode = error.code;
                        var errorMessage = error.message;
                        // [START_EXCLUDE]
                        if (errorCode === 'auth/wrong-password') 
                        {
                            alert('Wrong password.');
                        } else {
                            alert(errorMessage);
                        }
                        console.log(error);
                        document.getElementById('quickstart-sign-in').disabled = false;
                    // [END_EXCLUDE]
                    });
                //alert('hi');
                // [END authwithemail]
                }
                document.getElementById('quickstart-sign-in').disabled = true;

            }

我的HTML表单

<form id="login-form" class="form" action="" method="post">
                                <div class="form-group">
                                    <input type="text" name="email" id="email" class="form-control login-input" placeholder="username">
                                </div>
                                <div class="form-group">
                                    <input class="form-control login-input" type="password" placeholder="Password" id="password" name="password">
                                    <i id="open" class="fa fa-eye fa-2x"></i>
                                    <i id="closed" class="fa fa-eye-slash fa-2x"></i>
                                </div>
                                <div class="form-group">
                                    <input type="submit" id="quickstart-sign-in" name="quickstart-sign-in" class="form-control btn btn-info btn-md login-bt" value="Login" onclick="toggleSignIn()">
                                </div>
                                <div class="form-group text-center forgot">
                                    <a href="#">Forgot username</a> / <a href="#">password?</a>
                                </div>
                            </form>

下面是我的servlet(提交表单的地方),如果你感兴趣的话

public class LoginValidator extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String email = request.getParameter("email");
        System.out.println("Printing email: "+email);

        try {

            System.out.println("inside try");

            User user = new User();
            UserRight userRight = new UserRight();

            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.registerTypeAdapter(Date.class, new DateTypeDeserializer());
            Gson gson = gsonBuilder.create();

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(BaseURLs.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .build();

            //Get user
            RestEndPointsInterface endPoint = retrofit.create(RestEndPointsInterface.class);
            Call<User> call = endPoint.getUserByEmail(email);
            user = call.execute().body();

            System.out.println(user.getName());

            //Get user rights
            Call<UserRight> userRightCall = endPoint.getUserRightByID(user.getUserRights().getIduserRight());
            userRight = userRightCall.execute().body();

            System.out.println(userRight.getUserRight());

            if(userRight.getUserRight().equals("admin"))
            {
                RequestDispatcher requestDispatcher = request.getRequestDispatcher("LoadSellPendingApprovals");
                requestDispatcher.forward(request, response);
            }
            else
            {
                RequestDispatcher requestDispatcher = request.getRequestDispatcher("index.html");
                requestDispatcher.forward(request, response);
            }


        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

在我的IDE控制台中,输出如下(输出由servlet打印)

Printing email: email@example.com
inside try
Printing email: null
inside try
java.lang.IllegalArgumentException: Path parameter "email" value must not be null.

共有1个答案

李胡媚
2023-03-14

这种说法是罪魁祸首:

window.location.href = 'LoginValidator'

它出现在这个代码块中:

fetch(url, options)
   .then(response => response.json())
   .then(data => console.log(data))
   .catch(e => console.error(e))
   window.location.href = 'LoginValidator' // <= HERE

缩进使它看起来像是cat块的一部分,但是不管在函数的其余部分发生了什么,这将被执行并向servlet发送一个额外的GET请求。

由于servlet没有区分GET和POST请求(所有内容都被重定向到过程请求()),您将看到您看到的输出。

 类似资料:
  • 问题内容: 我有一个要通过jQuery捕获并通过AJAX发送的表单。我的问题是,每次刷新页面时,表单都会提交多次。 我尝试取消绑定“提交”按钮,但通常在第一次提交后发布表单。任何帮助,将不胜感激 问题答案: 您最有可能正在使用或触发ajax事件。试试这个:

  • 问题内容: 我有一个模式表单,用户必须完成表单(否则验证将显示必填字段错误消息),然后单击“提交输入类型”,不执行任何操作,然后再次单击它,然后将通过ajax发布,并返回“谢谢”消息。 我环顾了Stackoverflow,并为遇到的问题应用了答案,但仍然无法正常工作。我确实删除了event.preventDefault(); 从中,以及$(“#review- form”)。submit(funct

  • 问题内容: 我有HTML两种形式,一种使用PHP进入数据库时​​提交数据,另一种将用户定向到Paypal付款页面,我的问题是用户将不得不同时提交两种形式,我当然不希望它们必须做。无论如何,对于两种形式都可以使用一个提交按钮吗? (欢迎使用Javascript) 问题答案: 您应该能够使用JavaScript做到这一点: 如果您的表单具有ID: 如果您的表单没有ID,但有名称:

  • 我正在做一个Django项目,其中一个表单不会提交。我发现罪魁祸首是一些JavaScript,它格式化了货币输入(当我移除JS或移除输入时,它提交) 这是我的简化表单--JS来自html5货币/货币输入

  • 问题内容: 我有一个看起来像这样的表格: 当我绑定到表单的Submit()时,似乎无法访问用户单击的图像。因此,我试图绑定到单击图像本身(),该图像总是提交表单,无论我是否尝试 返回false; event.stopPropogation(); 要么 event.preventDefault(); 因为所有这些都是表单事件。 我应该将$ .post()附加到form.submit()事件上吗,如果

  • 本文向大家介绍利用JavaScript阻止表单提交的两种方法,包括了利用JavaScript阻止表单提交的两种方法的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,阻止表单默认提交行为的方法有两种,分别是: (1) return false 示例代码 (2) 使用preventDefault() 在标准浏览器中,阻止浏览器默认行为使用event.preventDefault(),