java - 如何在不使用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>
解决方案
对于初学者来说,这是一个巨大的安全漏洞。你不能做这样的数据库查询;使用 PreparedStatement。或者,填写用户名:
joe'; DROP TABLE signupform CASCADE; --
你的数据库就会消失。
您似乎知道preparedstatements 是如何工作的(您将它用于插入)。您必须在任何地方使用它,您的所有 SQL 几乎都必须是单个字符串常量。如果您曾经键入"SELECT ...." +...
停止。不要那样做。
你想要的不是轻易就能做到的。这不是网络的工作方式。客户端是客户端,服务器是服务器,除非您明确要求,否则它们不会相互联系。
客户端必须使用 javascript(在客户端上运行的代码)在键入时询问服务器,触发用户名字段更改,这本身就很棘手(有很多方法可以更改浏览器中的文本字段。例如,您可以右键单击并选择粘贴,因此注册键盘处理程序不好)。
简单的解决方案:使用setInterval
每 ±200 毫秒左右检查一次。如果自上次检查后该字段尚未修改,则不要执行任何操作,并且不要检查是否正在进行 ajax 调用。否则,向服务器发送一个 ajax 调用来询问,并操纵 DOM 以反映这一点。
您将不得不学习 javascript,这.. 并不是您在一个小时内就能完成的事情。这真的可以归结为:“我如何编写 webapps”。这个问题有答案,但 SO 不是一个好地方。这对于书籍和非常长的教程来说更重要。
推荐阅读
- javascript - 如何用新的图像替换图像,而不是在 API 提交后添加到页面?
- date - 日期、天数、周数、差异、培训和轮班开始公式
- sqlite - sqlite 内存数据库在执行之间持久化
- python - 用于在球体表面均匀分布点的万无一失的算法?
- r - 将 ggplotly() 图的图例设置为只有颜色而不是形状索引
- android-studio - 有什么方法可以计算 Android Studio 中微调器中的按钮点击次数?
- ruby - 红宝石中的尾递归在条件之前和之后产生总和?
- r - 如何在 R 中使用多个列表列展平数据框(从 BigQuery 加载)
- reactjs - 将 publicPath 添加到 Storybook React
- php - 为什么 $wpdb->insert() 会导致 sql 语法错误?