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>密 码</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")); } } // } }
还是会提交两次在控制台输出如下,并且验证码输入错误会跳转页面,不能阻止表单的提交。
0
收起
正在回答
2回答
因为ajax是异步请求,也就是js中的代码会同时执行,你将var ajaxFlag设置为true,因为是异步执请求,所以js中的代码也会执行,代码执行顺序就变了,return ajaxFlag的代码会先执行,那么validateCode方法一直返回的也就是true了,所以表单会成功跳转,根据你的代码你可以将ajax请求改为同步请求,就可以完成你需要的效果了,如下图所示。这里不建议同学使用ajax,因为ajax就是用来做异步请求的,改为同步请求就没有太大的意义了,建议你可以直接使用js去写,或者之前给你提供的思路,祝学习愉快~
chrismorgen
2018-07-18 18:36:59
这里不需要使用json数据的,给你一个思路,你完全可以使用表单提交数据,然后在LoginServlet中获取表单中的用户名、密码、验证码。先判断验证码是否正确,如果正确去检查用户名和密码,如果验证码错误,则重新跳转到Login.jsp页面,表单提交和ajax都将数据提交到了LoginServlet中就会出现你的问题。祝学习愉快~
从网页搭建入门Java Web2018版
- 参与学习 人
- 提交作业 1088 份
- 解答问题 10205 个
如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星