JSP 로그인 구현 - JSP logeu-in guhyeon

[ 기본 셋팅 ]

1) home_user 테이블 생성

CREATE TABLE home_user(
	id       VARCHAR2(300) NOT NULL,
	pwd      VARCHAR2(200) NOT NULL,
	name     VARCHAR2(200) NOT NULL,
	email    VARCHAR2(300),
	gender   VARCHAR2(200) NOT NULL,
	birthday DATE,
	phone    VARCHAR2(300) NOT NULL,
	address  VARCHAR2(500) NOT NULL,
	hit      NUMBER, // 추천 운동 카테고리
	home_level    VARCHAR2(300),
    	admin   CHAR(1) CHECK(admin IN('y','n')),
	CONSTRAINT PK_home_user PRIMARY KEY(id)
);
INSERT INTO home_user VALUES('hong','1234','홍길동','','male',
'2000-01-01','010-0000-0000','서울특별시 강남구 역삼동','0','상','y');
// 일단 테스트로 값을 넣었음 , 나중엔 UPDATE로 사용자 입력 값 넣을 예정

2) 폴더 및 JSP 생성하기

webcontent안에 user폴더 만들기

user폴더 안에 login.jsp / login_ok.jsp / logout.jsp / logout_ok.jsp 만들기

3) UserVO 만들기

package com.sist.dao;
import java.util.*;
public class UserVO {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private String gender;
	private Date birthday;
	private String phone;
	private String address;
	private int hit;
	private String home_level;
	private String admin;
	private String msg; // db엔 없음
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	public String getHome_level() {
		return home_level;
	}
	public void setHome_level(String home_level) {
		this.home_level = home_level;
	}
	public String getAdmin() {
		return admin;
	}
	public void setAdmin(String admin) {
		this.admin = admin;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
}

[ 로그인 처리 ]

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 로그인 처리
	String id=(String)session.getAttribute("id"); 
	// 로그인 화면 변환 
	String log_jsp="";
	if(id==null) // 로그인이 안된 상태 
		log_jsp="../user/login.jsp";
	else // 로그인이 된 상태
		log_jsp="../user/logout.jsp";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 구현</title>
</head>
<body>
	<div class="container">
		<!-- log_jsp 화면 include -->
		<jsp:include page="<%=log_jsp %>"></jsp:include>
	</div>
</body>
</html>

login.jsp

method → get / post (감춰서 보내기 / 그냥 보내기)
action → 데이터를 받을 파일명
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 화면구현</title>
</head>
<body>
	<div class="login">
		<form method=post action="../user/login_ok.jsp">
			<h2>로그인</h2>
			<div class="id_area">
				<input type=text name=id placeholder="아이디">
			</div>
			<div class="pwd_area">
				<input type=text name=pwd placeholder="비밀번호">
			</div>
			<input type=submit value="로그인" class="login_btn">
		</form>
	</div>
</body>
</html>

login_ok.jsp

login_ok.jsp => login.jsp의 태그에서 보낸 값을 받기
name과 받는 getParameter 뒤에 값이 같아야 값을 받을 수 있음
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="com.sist.dao.*"%>
<%
	// 1. 사용자가 보낸 id,pwd 받기
	String id=request.getParameter("id");
	String pwd=request.getParameter("pwd");
	// 2. DAO에서 보낸 값 받기 
	UserVO vo=UserDAO.userLogin(id, pwd);
	// 3. 로그인이 되면 => main.jsp
	// id가 틀린 경우 => 로그인 창으로 이동하기 
	if(vo.getMsg().equals("NOID")) {
%>		
	<!--  Ajex  -->
	<script>
    	alert("ID가 존재하지 않습니다");
	history.back();
	</script>
<% 		
	}
	// id가 존재 => 비밀번호가 틀린 경우 로그인창으로 이동하기 
	else if(vo.getMsg().equals("NOPWD")){
%>
	<script>
    	alert("비밀번호가 틀립니다");
    	history.back();
    	</script>
<% 		
	}
	// id 존재하고 pwd 맞는 경우 => id,name,admin여부를 서버에 저장하고 main.jsp로 이동 (session)
	else{
		session.setAttribute("id", vo.getId());
		session.setAttribute("name", vo.getName());
		session.setAttribute("admin", vo.getAdmin());
		
	// 사용하고있는 모든 JSP에서 세션에 등록된 모든 데이터 사용이 가능
    response.sendRedirect("../main/main.jsp");
	}
%>

UserDAO.java

package com.sist.dao;
import java.io.*;
import java.util.*;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;
public class UserDAO {
	// XML을 읽어서 데이터를 저장하는 객체 => 공통모듈 
	private static SqlSessionFactory ssf;
	static {
		try {
			Reader reader=Resources.getResourceAsReader("Config.xml");
			ssf=new SqlSessionFactoryBuilder().build(reader);
			// getConnection,disConnection 대체 
		}catch (Exception ex) {
			ex.printStackTrace();
		}
	}
    
	// 로그인 처리가 되면 session에 저장해야함  (id,name,admin)
	public static UserVO userLogin(String id,String pwd) {
		UserVO vo=new UserVO();
		// 연결
		SqlSession session=null;
		try {
			// 연결
			session=ssf.openSession(); 
			// id가 몇개 존재하는지 확인하기 
			int count=session.selectOne("userIdCheck",id);
			// id가 없다면 NOID 메세지 보내기 
			if(count==0) {
				vo.setMsg("NOID");
			}
			// id가 존재한다면
			else {
				// id가 존재하면 user정보 가져오기 
				vo=session.selectOne("userGetInfoData",id);
				// user정보의 pwd와 사용자가 입력한 pwd 비교하기
				if(pwd.equals(vo.getPwd())) {
					vo.setMsg("OK");
				}
				// 비밀번호가 틀리면
				else {
					vo.setMsg("NOPWD");
				}
			}
		}catch (Exception ex) {
			ex.printStackTrace();
		}finally {
			if(session!=null)
				session.close();
		}
		return vo;
	}
}

[ DB 처리 ]

user-mapper.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sist.dao.user-mapper">
	<!-- Login -->
	<!-- id 체크하기 -->
	<select id="userIdCheck" resultType="int" parameterType="String">
		SELECT COUNT(*) FROM home_user
		WHERE id=#{id}
		<!-- 0 = id가 없다 / 1 => id가 존재 -->
	</select>
	<!-- 비밀번호 확인 -->
	<select id="userGetInfoData" resultType="com.sist.dao.UserVO" parameterType="String">
		SELECT pwd,id,name,admin FROM home_user
		WHERE id=#{id}
	</select>
	<!-- 회원가입 , 아이디중복체크 , 우편번호-->
  	<!-- 회원수정 -->
    <!-- 회원탈퇴 -->
    <!-- 아이디찾기 -->
    <!-- 비밀번호찾기 -->
    <!-- 비밀번호 변경 -->
    <!-- Admin 회원관리 -->
</mapper>

db.properties

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:XE
username=hr
password=happy

Config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 오라클을 연결하기 위한 환경설정 : 한개만 사용  -->
  <!-- properties 파일 읽기 -->
	<properties resource="db.properties"/>
	<typeAliases>
    	<!-- UserVO를 등록 -->
        <typeAlias type="com.sist.dao.UserVO" alias="UserVO"/>
	</typeAliases>
 	<!-- 오라클 연결하는 부분 : getConnection() -->
	<environments default="development"><!-- 개발 환경을 만든다 -->
    	<environment id="development">
       		<transactionManager type="JDBC"/>
      		<!-- 오라클 정보를 모아서 MyBatis 라이브러리에 전송 : DataSource -->
	       	<dataSource type="POOLED">
	           <property name="driver" value="${driver}"/>
	           <property name="url" value="${url}"/>
	           <property name="username" value="${username}"/>
	           <property name="password" value="${password}"/>
	       	</dataSource>
    	</environment>
 	</environments>
	<mappers>
		<mapper resource="com/sist/dao/user-mapper.xml"/>
		<!-- 나중엔 vo / mapper / dao 따로 패키지로 묶어서 한번에 선언할 예정 -->
	</mappers>
</configuration>

[ 로그아웃 처리 ]

logout.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>
	<div class=logout>
		<div>
			<%= session.getAttribute("name") %>님이 로그인 되었습니다.
		</div>
		<div>
			<%
				String admin=(String)session.getAttribute("admin");
				// 관리자와 일반유저로 분리 
				if(admin.equals("y"))
				{
			%>		
					<span>관리자</span>	
			<% 
			
				}
				else{
			%>	
					<span>일반유저</span>
			<%
				}
			%>
		</div>
		<div class="logout_btn">
			<form method=post action="../user/logout_ok.jsp">
				<input type=submint value="로그아웃" class="btn">
			</form>
		</div>
	</div>
</body>
</html>

logout_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    // session에 등록된 데이터 전체 삭제
    session.invalidate();
    // main.jsp로 이동 
    response.sendRedirect("../main/main.jsp"); 
%>