2017-12-31 40 views
0

サーブレットクラスを使用してWebアプリケーションを作成しています(バックエンドとjavascriptではサーブレットクラス、フロントエンドではHTMLでサーブレットでデータベースにアクセスしようとしています)ログイン、アップロードイメージ)、(サーブレットクラスのメソッド関数で)データベースクラスの新しいインスタンスを作成すると、クライアントはサーバーが送信するjsonを受信しません。jdbcと接続したときにサーブレットが応答しない

私は何のエラーもありません。ただ応答を返すだけではありません。

私はサーブレット

サーブレットクラス、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); 
    } 
} 

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

私はので、私はセッションで呼び出すXMLHttpRequestオブジェクト、との要求をしているイム、私はHTMLで働いて言ったように。 jsファイルでは、サーバーはデータを処理します(つまり、登録フォームでdbにユーザーを挿入します)が、クライアントに返される応答はありません。

サーブレットからdbリクエスト(クラスのインスタンス)を削除した場合、クライアントはmsgを正常に受信します。つまり、サーバーは応答をJSONとして返します。

+0

私はこれが現実の生産コードではないことを願っています。 r(あなたのように)、または十分に複雑なパスワードハッシュアルゴリズムを使用しない場合は、非常に危険です。 –

+0

はい大学のプロジェクトのためだけです – Cesar

答えて

0

を解決する値チェック:に

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

を:

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

私は知りませんどうしてこのエラーが修正されたのですか?もし誰かが本当に感謝してこれがなぜ機能するのかを知っていれば

-1

まず、デバッグを開始する必要があると思います。なぜなら、デバッグによって、なぜ応答を送信しないのかを簡単に見つけることができるからです。あなたは、サーブレットで書いたコードに基づいて

は、JSONマップは2つだけ条件

にデータが含まれています
  • session.isNewはtrueを返すと、関数が返すチェックユーザーtrueの場合
  • あなたのセッションは新しいものではありません。

上記の2つの場合のみ、マップにはいくつかのjsonデータが含まれます。ほとんどの場合、関数checkUserはfalseを返します。 デバッグそれに一度、それは私がちょうどHTMLのコードの行を変更することにより、それを修正し、あなたの問題

関連する問題