프로그래밍

[Web] Login Process 제작

RainIron 2021. 6. 17. 13:12
반응형

※ 개요 - Login 서블릿 작성 및 테스트

LoginForm.html에 포함된 id, pwd 파라미터를 Login 서블릿에 전송하고 Login 서블릿은 파라미터를 접수하여 다음과 같은 방법으로 인증한다.
이용자의 id는 'smith'이고, pwd는 '0000'인지 확인하여 맞으면 '로그인 성공', 아니면 '로그인 실패' 메시지를 이용자의 웹 브라우저에 표시한다.
- LoginServlet.java, Login.java, LoginResult.jsp으로 구성한다.

 

(생각)

- LoginServlet.java: service() 를 이용하여 웹 브라우저로부터 데이터를 입력받고, Login.java를 이용해 결과를 알아내어(Business Logic), LoginResult.jsp에 전달한다(Presentation Logic).

- LoginForm.html: 이용자의 id, pwd를 입력받을 수 있어야 한다. -> Servlet으로 결과를 전송할 수 있어야 한다.

- Login.java: 이용자의 id, pwd를 검사하여 로그인 성공 또는 로그인 실패를 리턴

- LoginResult.jsp: Login.java의 결과를 화면에 출력한다.

 

1. LoginProcess Web Project 제작

[File] - [New] - [Dynamic Web Project]

2. LoginServlet.java 틀 제작

수업에서 진행한 대로, service 메서드만 제작해보기로 한다.

기본으로 들어가야 할 response 속성을 지정해준다.

response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");

나머지 사항을 결정하기 위해 Login.java를 제작한다.

Login.java를 제작한 후, Business Logic을 완성한다.

// request를 가진 Login 객체 생성
Login lg = new Login(request);
		
// Login 객체의 check()를 사용해 결과를 확인 후, 로그인 성공 / 로그인 실패 메시지를 리턴
String result = lg.check();

LoginResult.jsp를 제작한 후, Presentation Logic을 완성한다.

// Presentation Logic
request.setAttribute("result", result);
getServletContext().getRequestDispatcher("/LoginResult.jsp").forward(request, response);

 

package com.tjoeun;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");

		// Business Logic
		// request를 가진 Login 객체 생성
		Login lg = new Login(request);
		
		// Login 객체의 check()를 사용해 결과를 확인 후, 로그인 성공 / 로그인 실패 메시지를 리턴
		String result = lg.check();
		
		// Presentation Logic
		request.setAttribute("result", result);
		getServletContext().getRequestDispatcher("/LoginResult.jsp").forward(request, response);
		
	}

}

 

3. Login.java

package com.tjoeun;

import javax.servlet.http.HttpServletRequest;

public class Login {
	private HttpServletRequest request;

	// Constructor
	public Login() {}
	public Login(HttpServletRequest request) {
		setRequest(request);
	}
	
	// set, get method
	public HttpServletRequest getRequest() {
		return request;
	}
	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}
	
	public String check() {
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		if(id != null && !id.equals("") && pwd != null && !pwd.equals("")) {
			if(id.equals("smith") && pwd.equals("0000")) {
				return "로그인 성공";
			}
		}
		return "로그인 실패";
	}
}

 

4. LoginForm.html

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>로그인 폼</title>
</head>
<body>
	<h3>로그인</h3>
	<form action="/LoginProcess/LoginServlet" method="post">
		<div>
			ID: <input type = "text" name = "id">
		</div>
		<div>
			Password: <input type = "password" name = "pwd">
		</div>
		<div>
			<button type = "submit">확인</button>
		</div>
	</form>
</body>
</html>

=> form의 action: "/WebDynamicProject/Servlet"

 

5. LoginResult.jsp

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>로그인 결과 창</title>
	</head>
<body>
	<h3 id = "result">
		<%
			String result = (String)request.getAttribute("result");
		%>
		<%=result %>
	</h3>
</body>
</html>

6. 결과

 

프로그램 구조도


※ 추가 개선

1. Login.java 개선: 외부 txt 파일에서 Id, Password를 비교해 결과를 반환하기.

package com.tjoeun;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.ArrayList;

public class Login {
	private HttpServletRequest request;

	// Constructor
	public Login() {}
	public Login(HttpServletRequest request) {
		setRequest(request);
	}
	
	// set, get method
	public HttpServletRequest getRequest() {
		return request;
	}
	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}
	
	public String check() {
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		
		ArrayList<String> member = new ArrayList<>();
		
		File file = new File("C:\\labs\\id_pwd_list.txt");
		try {
			FileReader filereader = new FileReader(file);
			BufferedReader bufreader = new BufferedReader(filereader);
			String line = "";
				while((line = bufreader.readLine()) != null) {
					member.add(line);
				}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		for(int i = 0; i<member.size();i++) {
			String[] tmp = member.get(i).split(",");
			if(id.equals(tmp[0]) && pwd.equals(tmp[1])) {
				return "로그인 성공";
			}
		}
		return "로그인 실패";
	}
}

2. MySQL과 연동하고, DAO(Data Access Object), VO(Value Object) 개념 활용하여 개선하기

* [중요] MySQL과 연동하기 위해, JDBC 드라이버를 Tomcat의 lib에 넣어줘야 한다.

1) Login.java 수정한 파트

public boolean check() {
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		
		UserDAO dao = new UserDAO();
		UserVO vo = new UserVO(id, pwd);
		return dao.login(vo);
	}

2) UserDAO.java 제작

package com.tjoeun;

import java.sql.*;

public class UserDAO 
{
	static String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&serverTimezone=UTC&SSL=false";
	static Connection conn;
	static PreparedStatement pstmt;
	static ResultSet rs;
	static int cnt = 0;
	
	public UserDAO() {}
	
	public static Connection getConn() {
		try {
			conn = DriverManager.getConnection(url, "root", "dncjf1357");
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
    public boolean login(UserVO vo) {
    	
    	String sql = "SELECT count(*) AS cnt FROM user WHERE username = ? AND upass = ?;";
    	conn = getConn();
    	try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, vo.getId());
			pstmt.setString(2, vo.getPwd());
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				cnt = rs.getInt("cnt");
			}
			
			if(cnt > 0) {
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} 
  	
    	return false;
    }
    
}

3) UserVO.java 제작: UserVO 클래스에는 id, pwd를 가지고 있게함

4) 나머지 파일도 변경한 부분에 맞춰서 조금씩 수정하면 된다.

 

반응형