servlet 在与 JDBC 连接时没有响应



我正在使用java中的servlets类为后端和javascript和html为前端创建一个Web应用程序,我正在尝试访问servlet中的数据库以在post请求中创建验证(即:登录,上传图像),当我创建数据库类的新实例(在servlet类的方法函数中)时,客户端没有收到服务器应该发送的json。

我没有收到任何错误,只是没有发回响应。

我想知道为什么会这样,我对servlet有点陌生

Servlet 类,登录.java:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.stream.Collectors;
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 javax.servlet.http.HttpSession;
import org.json.JSONObject;
@WebServlet("/Login")
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
public Login() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession();
JSONObject reqBody = new JSONObject(request.getReader().lines().collect(Collectors.joining(System.lineSeparator())));
JSONObject json = new JSONObject();
Database db = new Database("postgresql", "localhost", "5432", "first_project", "postgres", "masterkey");
if(session.isNew()) {
if(db.checkUser(reqBody.getString("email"), reqBody.getString("pass")) == true) {
if (db.isAdmin(reqBody.getString("email"))) {
storeValue(reqBody.getString("email"), reqBody.getString("pass"), true, session);
json.put("status", "200");
} else {
storeValue(reqBody.getString("email"), reqBody.getString("pass"), false, session);
json.put("status", "200");
}
} else {
session.invalidate();
}           
} else {
json.put("status", "you're already logged in");
}   
out.println(json.toString());       
}
private void storeValue(String email, String password, boolean admin, HttpSession session) {
if(email == null) {
session.setAttribute("email", "");
session.setAttribute("password", "");
session.setAttribute("admin", "");
} else {
session.setAttribute("email", email);
session.setAttribute("password", password);
session.setAttribute("admin", admin);
}
}

数据库.java:

public class Database {
protected ResultSet rs;
protected ResultSetMetaData rsmd;
protected JSONArray table;
protected JSONObject row;
protected PreparedStatement pstmt;
protected Connection con;
public Database(String jdbc,String host,String port, String db, String user, String pass){
try {
Class.forName("org.postgresql.Driver");
this.con= DriverManager.getConnection("jdbc:"+jdbc+"://"+host+":"+port+"/"+db,user,pass);
}
catch(Exception e){
e.getStackTrace();
}
}
public boolean checkUser(String email, String password) {
boolean st = false; 
try {
this.pstmt = con.prepareStatement("SELECT * FROM users WHERE email=? and password=?");
this.pstmt.setString(1, email);
this.pstmt.setString(2, password);
this.rs = this.pstmt.executeQuery();
st = this.rs.next();
} catch (Exception e) { 
e.printStackTrace();
}
return st;
}
public boolean isAdmin(String email) {
boolean st = false;
try {
this.pstmt = con.prepareStatement("SELECT admin FROM users WHERE email=?");
this.pstmt.setString(1, email);
this.rs = this.pstmt.executeQuery();
rs.next();
if(this.rs.getString("admin").equals("t")) 
st = true;
} catch (Exception e) {
e.printStackTrace();
}
return st;
}

XHR.js:

function XHR() {
var xmlObject = null;
const xhr = (method,url,params,headers) => {
return new Promise((res, rej) => {
try {
xmlObject = new XMLHttpRequest();
xmlObject.open(method, url, true);
xmlObject.onload = () => {
if (xmlObject.status >= 200 && xmlObject.status < 300) {
res(JSON.parse(xmlObject.responseText));
} else {
rej({
status: xmlObject.status,
statusText: xmlObject.statusText
});
}
};
for (var header in headers) {
xmlObject.setRequestHeader(header, headers[header]);
}
if (method === 'POST') {
xmlObject.send(JSON.stringify(params));
}
else{
xmlObject.send();
}

} catch (err) {
console.log('error');
rej(err);
}
});
}

会话.js:

var wrapper = new XHR();
function $(id) {
return document.getElementById(id);
}
function login() {
var email = $('email').value;
var password = $('password').value;
wrapper.post('./Login',{email:email, pass:password},{'Content-Type':'application/x-www-form-urlencoded'}).then(function(data){
console.log(data)
alert(data);
});
}   
$('login').addEventListener('click', login);

登录.html:

<head>     
<link rel="stylesheet" type="text/css" href="style/login.css">
<script src="js/XHR.js"></script>
<script src="js/w3.js"></script>  
<title>First project</title>
</head>
<body>
<div w3-include-html="./layout/header.html"></div>
<div class="login-page">
<h1> Log in</h1>
<form class="register-form">
<div class="form">
<input id="email" type="text" placeholder="email address"/>
<input id="password" type="password" placeholder="password"/>   
<button id="login">login</button>
<p class="message">Already registered?
<a href="./login.html">Sign in </a>
</p>
</div>
</form>
</div> 
<script src="js/session.js"></script>  
</body>
</html> 

正如我所说,我正在使用html,所以我使用xmlhttprequest对象执行请求,我在session.js文件中调用,服务器处理数据(即以寄存器形式在db中插入用户),但不会响应返回客户端。

如果我从servlet中删除数据库请求(类的实例),客户端将成功接收msg,这意味着服务器将响应发送回(作为JSON)。

我只是通过在 html 中更改代码行来修复它:

<input id="email" type="text" placeholder="email address"/>

自:

<input id="email" type="email" placeholder="email address"/>

我不知道为什么修复了错误,如果有人知道会非常感激和酷知道为什么这有效

首先,我认为您需要开始调试。因为通过调试,您可以轻松找出它不发送响应的原因。

根据您在 servlet 中编写的代码,json map 将仅在两个条件下包含数据

  • 当 session.isNew 返回 true 并且函数 checkUser 返回 true 时
  • 当您的会话不是新的时。

只有在上述两种情况下,您的地图才会包含一些 json 数据。大多数情况下,函数用户查核返回 false。 调试一次并检查它将解决您的问题的值

最新更新