Model2 (세션을 이용한 로그인, 로그아웃) (D-88)

최우정·2022년 6월 13일
0

100일

목록 보기
13/17
post-thumbnail

USERS 테이블 만들기

📒 프로젝트 코드

✏️ 사용자가 처음으로 접속하는 페이지(index.jsp) 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8">
<title>Index</title>
</head>
<body>
	<%
		String id = (String)session.getAttribute("id");
	
		if(id==null) {
	%>
		<a href = "loginForm.html">로그인</a>
	<%
		}
		else {
	%>	
		<a href = "logout">로그아웃</a>
	<%
		}
	%>
</body>
</html>

✏️ 로그인에 사용될 아이디와 비밀번호를 입력받을 수 있는 페이지(loginForm.html) 작성

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>loginForm</title>
<style>
	#loginFormArea {
		margin : auto;
		width : 400px;
		height : 200px;
		border : 2px double purple;
		border-radius : 10px;
		text-align : center;
	}
	fieldset {
		text-align : center;
		border : none;
	}
	#selectButton {
		margin-top : 10px;
	}
	table {
		width : 380px;
		margin : auto;
	}
	.td_left {
		width : 180px;
	}
	.td_right {
		width : 200px;
	}
</style>
</head>
<body>
	<section id = "loginFormArea">
		<h1>로그인</h1>
		<form action = "login" method = "POST">
			<fieldset>
				<table>
					<tr>
						<td class = "td_left">
							<label for = "id">아이디 : </label>
						</td>
						<td class = "td_right">
							<input type = "text" name = "id" id = "id"/>
						</td>
					</tr>
					<tr>
						<td class = "td_left">
							<label for = "passwd">비밀번호 : </label>
						</td>
						<td class = "td_right">
							<input type = "password" name = "passwd" id = "passwd"/>
						</td>						
					</tr>
				</table>
				
				<input type = "submit" value = "로그인" id = "selectButton"/>
			</fieldset>
		</form>
	</section>
</body>
</html>

✏️ 로그인 요청을 처리하는(요청을 받는) 서블릿 페이지(LoginServlet.java) 작성

package controller;

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;
import javax.servlet.http.HttpSession;
import svc.LoginService;
import vo.Member;

/**
 * Servlet implementation class LoginServiet
 */
@WebServlet("/login")
public class LoginServiet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServiet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, 
	   HttpServletResponse response)
	 */
    
	protected void doPost(HttpServletRequest request,
	HttpServletResponse response) throws ServletException, IOException 
	{
		// TODO Auto-generated method stub
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");
		LoginService loginService = new LoginService();
		Member loginMember = loginService.getLoginMember(id,passwd);
		//로그인이 성공되면 Member 객체가 넘어오고 실패하면 null이 넘어옴
		
		if(loginMember != null) {
			HttpSession session = request.getSession();
			session.setAttribute("id", id);
			response.sendRedirect("index.jsp");
		}
		else {
			response.setContentType("text/html;charset=UTF-8");
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('로그인실패')");
			out.println("history.back()");
			out.println("</script>");
		}
	}
	

}

✏️ 로그인 비즈니스 로직을 처리하는 파일(LoginService.java) 코드 작성

package svc;

import static db.JdbcUtil.*;
import java.sql.Connection;
import dao.LoginDAO;
import vo.Member;
public class LoginService {

    public Member getLoginMember(String id, String passwd) {
        // TODO Auto-generated constructor stub
    	LoginDAO loginDAO = LoginDAO.getInstance();
    	Connection con = getConnection();
    	loginDAO.setConnection(con);
    	Member loginMember = loginDAO.selectLoginMember(id,passwd);
    	close(con);
    	return loginMember;
    }
    
}

✏️ 데이터베이스에 로그인 관련 SQL 구문을 전송하는 파일(LoginDAO.java) 코드 작성

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import vo.Member;
import static db.JdbcUtil.*;

public class LoginDAO {
	
	private static LoginDAO loginDAO;
	private Connection con;
	
	private LoginDAO() {
		// TODO Auto-generated constructor stub
	}
	
	public static LoginDAO getInstance() {
		if(loginDAO == null) {
			loginDAO = new LoginDAO();
		}
		return loginDAO;
	}
	
	public void setConnection(Connection con) {
		this.con = con;
	}
	
	public Member selectLoginMember (String id, String passwd) {
		// TODO Auto-generated constructor stub
		Member loginMember = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			pstmt = con.prepareStatement("SELECT * FROM users WHERE id = ? AND passwd = ?");
			pstmt.setString(1, id);
			pstmt.setString(2, passwd);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				loginMember = new Member();
				loginMember.setAddr(rs.getString("addr"));
				loginMember.setAge(rs.getInt("age"));
				loginMember.setEmail(rs.getString("email"));
				loginMember.setGender(rs.getString("gender"));
				loginMember.setId(rs.getString("id"));
				loginMember.setName(rs.getString("name"));
				loginMember.setNation(rs.getString("nation"));
				loginMember.setPasswd(rs.getString("passwd"));
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		finally {
			try {
				close(rs);
				close(pstmt);
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
		}
		return loginMember;
	}
}

✏️ 데이터베이스 작업 시 반복적으로 사용하는 기능들을 정의한 파일(JdbcUtil.java) 코드 작성

package db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.*;
import javax.sql.DataSource;

public class JdbcUtil {
	
	public static Connection getConnection () {
		Connection con = null;
		try {
			Context initCtx = new InitialContext();
			//Context envCtx = (Context)initCtx.lookup("java:comp/env/jdbc/mariaDB");
			DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/mariaDB");
			con = ds.getConnection();
			con.setAutoCommit(false);
			System.out.println("connect succes");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return con;
	}
	
	public static void close (Connection con) {
		try {
			con.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void close (Statement stmt) {
		try {
			stmt.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void close (ResultSet rs) {
		try {
			rs.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void commit (Connection con) {
		try {
			con.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public static void rollback (Connection con) {
		try {
			con.rollback();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

✏️ 회원 한 명의 정보를 저장하는 파일(Member.java) 코드 작성

package vo;

public class Member {
	private String name;
	private String addr;
	private int age;
	private String nation;
	private String id;
	private String passwd;
	private String gender;
	private String email;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getNation() {
		return nation;
	}
	public void setNation(String nation) {
		this.nation = nation;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}

✏️ 로그아웃 요청을 처리하는 서블릿(LogoutServlet.java) 코드 작성

package controller;

import java.io.IOException;
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;

/**
 * Servlet implementation class LogoutServlet
 */
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogoutServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, 
	   HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request,
	HttpServletResponse response) throws ServletException, 
	IOException {
		// TODO Auto-generated method stub
		// id 정보를 저장하고 있는 session을 삭제 후 index.jsp로 리다이렉트
		HttpSession session = request.getSession();
		session.invalidate();
		response.sendRedirect("index.jsp");
	}

}

✏️ CP(Connection Pool)에 관한 설정 파일인 context.xml 파일 코드 작성

<Context>
	<Resource 
	name="jdbc/mariaDB"
	auth = "Container"
	type = "javax.sql.DataSource"
	username = "java"
	password = "java"
	driverClassName = "org.mariadb.jdbc.Driver"
	factory = "org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
	url = "jdbc:mysql://localhost:3306/testdb"
	maxActive = "500" />
</Context>

profile
비전공자 Java, JavaScript, Html, Css, C++ 공부중

0개의 댓글