【问题标题】:How to check if username exists in database or not without submitting the form using jsp?如何在不使用jsp提交表单的情况下检查用户名是否存在于数据库中?
【发布时间】:2020-12-10 01:03:10
【问题描述】:

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

controller1.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 中。当用户填写相应的字段时,它应该立即在同一页面上报告用户是否存在。

Signupform.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>

【问题讨论】:

  • 你不能使用 AJAX 吗?
  • 我试过了,但它不起作用。如果纯 JSP 是可能的,我会很高兴。
  • 你试过什么?你可以在你的问题中添加它吗?

标签: java mysql validation jsp


【解决方案1】:

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

joe'; DROP TABLE signupform CASCADE; --

你的数据库就会消失。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多