首页 > 解决方案 > 如何在不使用jsp提交表单的情况下检查用户名是否存在于数据库中?

问题描述

我正在尝试在不提交表单的情况下检查用户名是否存在于数据库中。但我没有成功。下面是我的代码。

控制器1.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ page import="java.io.*,java.util.*,java.sql.*"%>
<%@ page import="javax.servlet.http.*,javax.servlet.*"%>
<%@ page import="java.util.regex.*"%>
<%-- <%@ page import="java.net.URLEncoder" session="false" %> --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Controller</title>
</head>
<body>
    <div class="container">
        <%
    String Username = request.getParameter("Username");
        session.setAttribute( "theName", Username );
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/abc?autoReconnect=true&useSSL=false", "root", "");
                try{
                    Statement st = con.createStatement();
                    ResultSet rs;
                    rs = st.executeQuery("select * from signupform where Username='" + Username + "'");
                if(rs.next()){
                    String usermessage = "Username already exists";
                    request.getSession().setAttribute("usermessage", usermessage);
                    response.sendRedirect("Signupform.jsp");
                }
                else{
                PreparedStatement ps = con. prepareStatement("insert into signupform(Username) values(?)");
                ps.setString(1, Username);
        if(Username.isEmpty())
        {
            String message = "Please fill all the fields";
            request.getSession().setAttribute("message", message);
            /* response.sendRedirect("Signupform.jsp?message="+ URLEncoder.encode(message, "UTF-8")); */
            response.sendRedirect("Signupform.jsp");
        }
        else{
            ps.executeUpdate();
            response.sendRedirect("Welcome.jsp");
        }
                }
                }
    catch (Exception e) {
        out.println(e);
    }
%>
    </div>
</body>
</html>

用于提供输入的表单显示在代码 Signupform.jsp 中。当用户填写相应字段时,它应该立即在同一页面中报告用户是否存在。

注册表格.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Register</title>
<link Rel=stylesheet type="text/css" href="main.css">
</head>
<body>
<div class ="container">      
<div>
<form action="controller1.jsp" method = "POST">
Username <input type = "text" name = "Username" value="">
<br>
<input type="submit" value="Submit"/>
<input type="reset" value="Reset"/>
<br>
<p>${usermessage}</p>
<c:remove var="usermessage" scope="session"/>

</form>
</div>
   </div>
   </body>
</html>

标签: javamysqlvalidationjsp

解决方案


对于初学者来说,这是一个巨大的安全漏洞。你不能做这样的数据库查询;使用 PreparedStatement。或者,填写用户名:

joe'; DROP TABLE signupform CASCADE; --

你的数据库就会消失。

您似乎知道preparedstatements 是如何工作的(您将它用于插入)。您必须在任何地方使用它,您的所有 SQL 几乎都必须是单个字符串常量。如果您曾经键入"SELECT ...." +...停止。不要那样做。

你想要的不是轻易就能做到的。这不是网络的工作方式。客户端是客户端,服务器是服务器,除非您明确要求,否则它们不会相互联系。

客户端必须使用 javascript(在客户端上运行的代码)在键入时询问服务器,触发用户名字段更改,这本身就很棘手(有很多方法可以更改浏览器中的文本字段。例如,您可以右键单击并选择粘贴,因此注册键盘处理程序不好)。

简单的解决方案:使用setInterval每 ±200 毫秒左右检查一次。如果自上次检查后该字段尚未修改,则不要执行任何操作,并且不要检查是否正在进行 ajax 调用。否则,向服务器发送一个 ajax 调用来询问,并操纵 DOM 以反映这一点。

您将不得不学习 javascript,这.. 并不是您在一个小时内就能完成的事情。这真的可以归结为:“我如何编写 webapps”。这个问题有答案,但 SO 不是一个好地方。这对于书籍和非常长的教程来说更重要。


推荐阅读