2017-12-31 79 views
0

서블릿 클래스를 사용하여 자바에서 백엔드 및 자바 스크립트 용 HTML과 프론트 엔드 용 HTML을 만들고 있습니다. 서블릿에서 데이터베이스에 액세스하여 게시 요청에 유효성을 검사하려고합니다 (예 : 로그인, 업로드 이미지), 데이터베이스 클래스의 새 인스턴스를 만들 때 (서블릿 클래스의 메서드 함수에서) 클라이언트는 서버가 보내야하는 json을받지 못합니다.jdbc와 연결할 때 서블릿이 응답하지 않습니다

오류가 발생하지 않고 응답을 보내지 않고 있습니다.

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 :

는 는 나는이 일어나는 이유를 알고 싶습니다

, 나는, Login.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

난 그냥 HTML 코드의 라인 변경하여 고정 :

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

에 :

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

나는 잘 모릅니다을 왜 누군가가 진짜로 고맙고 시원할 것인가를 안다면 왜이 오류가 고쳐 졌을까요?

-1

우선 내가 디버깅을 시작해야한다고 생각합니다. 디버깅을 통해 응답을 보내지 않는 이유를 쉽게 알 수 있습니다. 당신은 서블릿에 쓴 코드를 기반으로

는 JSON지도는 두 가지 조건

에 데이터가 포함됩니다
  • session.isNew는 true를 반환하고 함수는 반환 checkUser 때 진정한
  • 세션은 새로운 것이 아니다 .

위의 두 경우에만지도에 몇 가지 json 데이터가 포함됩니다. 대부분 함수 checkUser는 false를 반환합니다. 디버그는 한 번 문제가 해결됩니다 값을 확인