【问题标题】:servlet not responding when connected with jdbc连接 jdbc 时 servlet 没有响应
【发布时间】:2018-06-10 23:27:53
【问题描述】:

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

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

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

Servlet 类,Login.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);
                }
            });
        }

session.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);

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 中删除 db 请求(类的实例),客户端会成功接收到 msg,这意味着服务器会发回响应(作为 JSON)。

【问题讨论】:

  • 我希望这不是真实的生产代码,因为以明文形式存储密码(就像您所做的那样)或没有足够复杂的密码哈希算法是非常不安全的。
  • 是的,它只是用于大学项目

标签: javascript java servlets jdbc xmlhttprequest


【解决方案1】:

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

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

到:

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

我不知道为什么会修复错误,如果有人知道会非常感激并且很酷地知道为什么会这样

【讨论】:

    【解决方案2】:

    首先我认为你需要开始调试。因为通过调试你可以很容易地找出它为什么不发送响应。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-11
      • 2012-06-25
      • 2012-03-02
      • 2019-10-27
      • 2014-03-31
      • 2012-02-17
      • 2022-01-07
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多