본문 바로가기

JSP, Servlet/JSP를 이용하여 로그인 페이지 만들기

[JSP] 데이터베이스를 이용한 회원관리 시스템 - 4(로그인 인증처리, 회원 인증 처리)

 입력 폼을 위한 서블릿 클래스 만들기

  패키지명 : com.human.controller

  클래스명 : LoginServlet

  URL Mapping : /login.do

  doPost() 메소드에서 아래와 같이 처리

     RequestDispatcher 객체를 이용하여 "meember/login.jsp로 forward 처리

  <참고> 일반적으로 홈페이지에서 로그인을 시도하면 login.do와 같은 요청이 일어난다.

 

로그인 시에 http://localhost:8181/web-project-09/login.do주소로 요청하는 것은 불편하므로 index.jsp 페이지를 생성하여 다음과 같이 입력한다.

<a href="member/login.jsp"> 로그인 페이지로 이동 </a>

웹 브라우저에 http://localhost:8181/web-project-09/ 만 입력하면 index.jsp가 자동실행

 

 아이디와 암호를 입력한 후에 “로그인” 버튼을 누르면 회원 인증 처리를 위해 <LoginServlet>이 요청된다.

 인증이 실패한 회원은 login.jsp로 이동

 인증이 성공한 회원은 main.jsp로 이동

 

<index.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원관리 시스템</title>
</head>
<body>
<h3>Welcome to visit this page</h3>
<a href="member/login.jsp">Login</a>
</body>
</html>

 

 데이터베이스에서 회원 정보 확인을 위한 메소드(memberDAO.java)

   userCheck() – member 테이블에서 아이디와 암호를 조회.
   아이디가 존재하지 않으면 -1 반환
   아이디는 있지만 암호가 맞지 않으면 0을 반환
   모두 일치하면 1을 반환

 

 getMember() – member 테이블에서 아이디로 해당 회원을 찾아 회원정보를
MemberVO 객체로 가져온다.

<memberDAO.java>

package com.human.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.human.dto.MemberVO;

public class MemberDAO {
	private MemberDAO() {
	}

	private static MemberDAO instance = new MemberDAO();

	public static MemberDAO getInstance() {
		return instance;
	}

	public Connection getConnection() throws Exception {
		Connection conn = null;
		Context initContext = new InitialContext();
		Context envContent = (Context) initContext.lookup("java:/comp/env");
		DataSource ds = (DataSource) envContent.lookup("jdbc/myoracle");
		conn = ds.getConnection();
		return conn;
	}

	/*
	 * 사용자가 입력한 userid, pwd가 일치하는지 확인 매개변수 : userid: 사용자가 입력한 아이디, pwd : 사용자가 입력한 암호
	 * 리턴값 : userid와 pwd가 테이브렝 존재하면 1을 반환 userid는 존재하지면 pwd가 틀리면 0을 반환 userid가 존재하지
	 * 않으면 -1을 반환
	 * 
	 */
	public int userCheck(String userid, String pwd) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		int result = -1;

		// membership 테이블에서 사용자 아이디가 userid인 레코드의 pwd column을 조회
		String sql = "select userid, pwd from membership where userid=?";

		try {
			conn = getConnection(); // DB 연결 시도
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);

			rs = pstmt.executeQuery();

			if (rs.next()) {
				String pwd_in_db = rs.getString("pwd");
				if (pwd_in_db != null && pwd.equals(pwd_in_db)) {
					// user id를 조건으로 pwd가 조회되면 입력받은 userid가 존재한다는 의미.
					result = 1;
				} else {
					result = 0;
				}
			} else {
				// 조회한 결과가 값이 없으므로 userid가 존재하지 않음.
				result = -1;
			}
			/*
			 * String memberid = rs.getString("userid"); String memberpwd =
			 * rs.getString("pwd"); int result;
			 * 
			 * if (memberid.isEmpty()) { result = -1; } else { if (memberid.equals(userid))
			 * { if (memberpwd.equals(pwd)) { result = 1; } else { result = 0; } } else {
			 * result = -1; } }
			 */
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null) {
					conn.close();
				}
				if (pstmt != null) {
					pstmt.close();
				}
				if (rs != null) {
					rs.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return result;
	}

	/*
	 * 매개변수에 입력된 사용자 id를 갖고 DB에서 사용자 정보를 조회하여 반환하는 메소드
	 */
	public MemberVO getUser(String userid) {
		MemberVO mVO = null; // 데이터가 없을 경우 null 값을 반환.
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		String sql = "select * from membership where userid=?";

		try {
			conn = getConnection(); // DB 연결 시도
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);

			rs = pstmt.executeQuery();
			
			if (rs.next()) {
				mVO = new MemberVO();
				mVO.setName(rs.getString("name"));
				mVO.setUserid(rs.getString("userid"));
				mVO.setPwd(rs.getString("pwd"));
				mVO.setEmail(rs.getString("email"));
				mVO.setPhone(rs.getString("phone"));
				mVO.setAdmin(rs.getInt("admin"));
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null) {
					conn.close();
				}
				if (pstmt != null) {
					pstmt.close();
				}
				if (rs != null) {
					rs.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		return mVO;
	}
}

 

 

LoginServlet.java 에거 회원인증 구현

 MemberDAO 객체를 생성하고, 이 객체의 userCheck()를 호출하여 사용자가 DB에 있는지 확인
 회원이 존재하면 DAO 객체의 getMember()를 호출하여 사용자 정보를 얻어온다.

 사용자 정보를 MemberVO 객체에 저장하고, login.jsp에 메세지 전달

 

(1) JSP에서 입력한 userid와 pwd 요청 매개변수를 읽어온다.
(2) 사용자 검증을 위하여 MemDAO 객체를 생성한다.
(3) MemberDAO 객체의 userCheck(userid, pwd)를 호출하여 조회결과를 얻어온다.
(4) 사용자가 존재하면
   MemberDAO객체의 getMember(userid)를 호출하여 사용자 정보를 얻어와 MemberVO 객 체에 저장한다.
   session 내장 객체에 “loginUser” 속성명으로 MemberVO 객체의 내용을 저장한다.
   request 파라미터의 “message” 속성에 “회원 가입에 성공하였습니다.” 를 저장

   문자열 변수 url에 "main.jsp"를 저장한다.

(5) 비밀번호가 맞지 않으면
   request 파라미터의 “message“ 속성에 “비밀번호가 맞지 않습니다”를 저장
   문자열 변수 url에 "login.jsp"를 저장한다.

(6) 사용자 아이디가 존재하지 않으면
   requst 파라미터의 “message” 속성에 “존재하지 않는 회원입니다”를 저장
   문자열 변수 url에 "login.jsp"를 저장한다.

(7) 지정된 url로 forward한다.

 

 

<LoginServlet.java>

package com.human.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 com.human.dao.MemberDAO;
import com.human.dto.MemberVO;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login.do") // URL mapping
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public LoginServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String userid = request.getParameter("userid");
		String pwd = request.getParameter("pwd");
		String url = ""; // forward할 주소를 지정하는 변수
		MemberVO member = null;

		// MemberDAO 객체생성
		MemberDAO mDao = MemberDAO.getInstance();

		// userid와 pwd DB에 있는지 유효성 검사
		int result = mDao.userCheck(userid, pwd);

		switch (result) {
		case 1: // userid와 pwd가 일치할 때
			// 사용자 정보를 DB에서 가져옴
			member = mDao.getUser(userid);
			HttpSession session = request.getSession();
			session.setAttribute("loginUser", member);
			request.setAttribute("message", "로그인에 성공하였습니다.");
			url = "main.jsp";
			break;
		case 0: // userid 일치 pwd 불일치
			request.setAttribute("message", "비밀번호가 맞지 않습니다.");
			url = "member/login.jsp";
			break;
		case -1: // userid가 존재하지 않음
			request.setAttribute("message", "존재하지않는 회원입니다.");
			url = "member/login.jsp";
			break;
		}

		RequestDispatcher dispatcher = request.getRequestDispatcher(url);
		dispatcher.forward(request, response);
	}

}

 

 

 

<form> 태그의 action 속성을 login.do로 지정하고, method 속성을 post로 지정

<login.jsp>

경로 수정

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Log In page</title>

<!-- 입력정보 유효성 검사 javascript -->
<script type="text/javascript" src="../script/member.js"></script>
</head>
<body>
	<h3>Log In</h3>
	<form method="POST" action="${pageContext.request.contextPath }/login.do" name="loginform">
		<table>
			<tr>
				<td>아이디</td>
				<td colspan="2"><input type="text" name="userid"></td>
			</tr>
			<tr>
				<td>비밀번호</td>
				<td colspan="2"><input type="password" name="pwd"></td>
			</tr>
			<tr>
				<td><input type="submit" value="Log In" onclick="return loginCheck()"></td>
				<td style="text-align: center"><input type="reset" value="cancle"></td>
				<td style="text-align: right"><input type="button" value="Join" onclick="location.href='${pageContext.request.contextPath }/join.do'">
				<td>
			</tr>
			<tr>
				<td colspan="3" style="text-align: center"><span style="color: red;">${message}</span></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

 

회원 전용 페이지 : main.jsp

 WebContent 바로 아래에 main.jsp 생성

 <form>태그의 action속성을 logout.do 로 지정한다.

<main.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Page for member</h1>
	<table>
			<tr>
				<td>안녕하세요</td>
				<td>${loginUser.name}(${loginUser.userid })님</td>
			</tr>
		</table>
	<form method="get" action="logout.do">
		<table>
			<tr>
				<td><input type="submit" value="logout"></td>
				<td><input type="button" value="modify" onclick="location.href='memberUpdate.do?userid=${loginUser.userid}'"></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

 

728x90
반응형