onsubmit="return validateCode()"的问题

onsubmit="return validateCode()"的问题

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath = request.getScheme() + ":" + "//" + request.getServerName() + ":" + request.getServerPort() + "/"
            + request.getServletContext().getContextPath() + "/";
%>
<!DOCTYPE html>
<html>
<head>
    <base href="<%=basePath%>">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>登录页面</title>
    <style type="text/css">
        a {
            text-decoration: none;
            font-size: 12px;
            color: #288bc4;
        }

        a:hover {
            text-decoration: underline;
        }

        img {
            margin: auto 0px;
        }
    </style>

</head>
<body>
<center>
    <h1>用户登录</h1>
    <form action="<%=basePath%>/LoginServlet" method="post" onsubmit="return validateCode()">
        <table width="300px" cellspacing="0px" cellpadding="0px" border="1px">
            <tr>
                <td>用户名</td>
                <td colspan="2"><input type="text" name="username" placeholder="用户名为3-12位字母数字或下划线组合"></td>
            </tr>
            <tr>
                <td>密&nbsp;码</td>
                <td colspan="2"><input type="password" name="password" placeholder="长度为5-12位字母数字或下划线组合"></td>
            </tr>
            <tr>
                <td>验证码</td>
                <td style="border-right-style:none;">
                    <input type="text" name="checkCode" maxlength="4" placeholder="请输入验证码" id="code">
                    <img src="<%=basePath%>/kaptcha.jpg" id="changecode"/>
                </td>
            </tr>
            <tr>
                <td colspan="3" style="text-align:center">
                    <input type="submit" value="登录" id="login">
                    <input type="reset" value="取消">
                </td>
            </tr>
        </table>
    </form>
</center>
<script src="js/jquery-1.12.4.min.js"></script>
<script>
    $(function () {
        $("#changecode").on("click", function () {
            $(this).attr("src", "<%=basePath%>/kaptcha.jpg?d=" + new Date().getTime());
        });
    });

    function validateCode() {
        var ajaxFlag = true;
        $.ajax({
            url: "<%=basePath%>/LoginServlet",
            type: "post",
            data: {
                checkCode: $("input[name=checkCode]").val()
            },
            dataType: "json",
            success: function (result) {
                var flag = result.flag;
                if (flag == false) {
                    alert('验证码输入有误!');
                    ajaxFlag = false;
                }
            }
        });
        if(!ajaxFlag){
            return false;
        }
    }
</script>
</body>
</html>
package com.imooc.servlet;

import com.google.code.kaptcha.Constants;
import com.sun.tools.javac.code.Attribute;
import netscape.javascript.JSObject;
import org.json.JSONObject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;

@WebServlet(name = "LoginServlet")
public class LoginServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String code = request.getParameter("checkCode");
        String sessionCode = (String) request.getSession().getAttribute("kcode");
        JSONObject jsonObject = null;

        System.out.println(code);
        System.out.println(sessionCode);


        if(code!=null && sessionCode!=null){
            if (code.equalsIgnoreCase(sessionCode)) {
                jsonObject = new JSONObject("{flag:true}");
                response.getOutputStream().write(jsonObject.toString().getBytes("UTF-8"));

            } else {
               jsonObject = new JSONObject("{flag:false}");
               response.getOutputStream().write(jsonObject.toString().getBytes("UTF-8"));
            }
        }



        //


    }
}

还是会提交两次在控制台输出如下,并且验证码输入错误会跳转页面,不能阻止表单的提交。

http://img1.sycdn.imooc.com//climg/5b4f0b6700011ec002600202.jpg


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

因为ajax是异步请求,也就是js中的代码会同时执行,你将var ajaxFlag设置为true,因为是异步执请求,所以js中的代码也会执行,代码执行顺序就变了,return ajaxFlag的代码会先执行,那么validateCode方法一直返回的也就是true了,所以表单会成功跳转,根据你的代码你可以将ajax请求改为同步请求,就可以完成你需要的效果了,如下图所示。这里不建议同学使用ajax,因为ajax就是用来做异步请求的,改为同步请求就没有太大的意义了,建议你可以直接使用js去写,或者之前给你提供的思路,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5b500e920001d2bc07600662.jpg



chrismorgen 2018-07-18 18:36:59

这里不需要使用json数据的,给你一个思路,你完全可以使用表单提交数据,然后在LoginServlet中获取表单中的用户名、密码、验证码。先判断验证码是否正确,如果正确去检查用户名和密码,如果验证码错误,则重新跳转到Login.jsp页面,表单提交和ajax都将数据提交到了LoginServlet中就会出现你的问题。祝学习愉快~

  • 提问者 KAGITO #1
    onsubmit="return validateCode()"是作业素材中给的,想知道怎么用
    2018-07-18 19:19:42
  • chrismorgen 回复 提问者 KAGITO #2
    该方法主要是判断表单是否可以提交,当点击提交按钮时,会触发js中的validateCode()方法,在该方法中我们对验证码进行核对,如果匹配成功,则返回true,允许表单提交,如果匹配失败,则返回false,不提交表单,这就是onsubmit="return validateCode()"的用法,祝学习愉快~
    2018-07-19 10:05:24
  • 提问者 KAGITO 回复 chrismorgen #3
    所以说我问题中写的validateCode方法用ajax,且写了return false却貌似没有阻止表单的提交,想知道是什么原因。
    2018-07-19 10:34:28
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10205    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师