2021.01.06 일지

0후·2021년 1월 6일
0

비트캠프

목록 보기
56/112

Login

  1. login용 form.jsp를 생성한다.
<%@page contentType="text/html;charset=utf-8" 
        import="java.util.ArrayList, mvc.domain.Member"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<meta charset="utf-8">
<script src="../js/trim.js"></script>
<script type="text/javascript"> 
    function check(){
      var emailval = f.email.value;
      emailval = trim(emailval);
      if(emailval.length == 0){
         alert("이메일을 넣어주세요");
         f.email.value = "";
         f.email.focus();
         return false;
      }else{
         pass = checkByteLen(emailval, 50);
         if(!pass){
            alert("이메일이 너무 길어요");
            f.email.focus();
            return false;
         }
      }
      
      var pwdval = f.pwd.value;
      pwdval = trim(pwdval);
      if(pwdval.length == 0){
         alert("비번을 넣어주세요");
         f.pwd.value = "";
         f.pwd.focus();
         return false;
      }else{
         pass = checkByteLen(pwdval, 30);
         if(!pass){
            alert("비번이 너무 길어요");
            f.pwd.focus();
            return false;
         }
      }

      f.submit();
   }

    function checkByteLen(str, size){
        var byteLen = getByteLen(str);
      if(byteLen <= size){
         return true;
      }else{
         return false;
      }
   }
   function getByteLen(str){
      return str.replace(/[\0-\x7f]|([0-\u07ff]|(.))/g,"$&$1$2").length;
    }
   
   function enterCheck(elm){
      if(event.keyCode == 13){
         if(elm == f.email){
            f.pwd.focus();
         }else{
            check();
         }
      }
   }
</script>
<style>
   table, th, td {
      border: 1px solid black;
      border-collapse: collapse;
   }
   th, td {
      padding: 5px;
   }
   a { text-decoration:none }
</style>
<body onload="document.f.email.focus()">
<h1 style="width:300px;margin:0 auto;text-align:center;">로그인</h1>
<form name="f" action="login.do?m=check" method="post">
   <table style="width:300px;height:200px;margin:0 auto;">
      <tr>
         <td colspan="2" style="width:30%;text-align:center;"><h2>입력폼</h2></td> 
      </tr>
      <tr>
         <th style="width:30%;">이메일</th> 
         <td><input name="email" type="email" onkeydown="enterCheck(this)"></td>
      </tr>
      <tr>
         <th style="width:30%;">비번</th> 
         <td><input name="pwd" type="password" onkeydown="enterCheck(this)"></td>
      </tr>
      <tr>
         <td colspan="2" style="text-align:center;">
            <input type="button" value="전송" onclick="check()"/>
            <input type="reset" value="취소"/>
         </td>
      </tr>
   </table>
   </form>
</body>
  1. index.jsp에 로그인 기능이 나타나도록 수정해준다.
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<!doctype html>
<html>
   <head>
      <meta charset="UTF-8">
       <title>MvcPj Index</title> 
   </head>
   <body>
      <div style="text-align:center">
         <h1>MvcPj Index</h1>
         <c:if test="${!empty loginPassUser}">
               ${loginPassUser.name} 님 환영해요*^^*
         </c:if>
         <p>
            <c:choose>
                  <c:when test="${empty loginPassUser}">
                     <a href="login/login.do?m=form">로그인</a>
                  </c:when>
                 <c:otherwise>
                    <a href="login/login.do?m=out">로그아웃</a>
                 </c:otherwise>
              </c:choose>
         </p>
      </div>
   </body>
</html>
  1. login.mvc.model 패키지 내 LoginSQL.java를 생성한다.
package login.mvc.model;

class LoginSQL {
	final static String MEMBER = "select * from MEMBER where EMAIL=?"; //인증된사람을 전부 세션에 넣기 위해 pwd가 아니라 *로 한다.
}
  1. mvc.domain 패키지 내 Member.java를 생성한다.
package mvc.domain;

import java.sql.*;

public class Member {
	private long seq;
	private String name;
	private String email;
	private String pwd;
	private String phone;
	private Date rdate;
	private Date update;
	
	public Member() {}

	public Member(long seq, String name, String email, String pwd, String phone, Date rdate, Date update) {
		this.seq = seq;
		this.name = name;
		this.email = email;
		this.pwd = pwd;
		this.phone = phone;
		this.rdate = rdate;
		this.update = update;
	}

	public long getSeq() {
		return seq;
	}

	public void setSeq(long seq) {
		this.seq = seq;
	}

	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 getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public Date getRdate() {
		return rdate;
	}

	public void setRdate(Date rdate) {
		this.rdate = rdate;
	}

	public Date getUpdate() {
		return update;
	}

	public void setUpdate(Date update) {
		this.update = update;
	}
}
  1. login.mvc.model 패키지 내 LoginDAO.java를 생성한다.
package login.mvc.model;

import java.sql.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import mvc.domain.Member;
import static login.mvc.model.LoginSQL.MEMBER;

class LoginDAO {
	private DataSource ds;
	LoginDAO(){
		try {
			Context initContext = new InitialContext();
		    Context envContext  = (Context)initContext.lookup("java:/comp/env");
		    ds = (DataSource)envContext.lookup("jdbc/myoracle");
		}catch(NamingException ne) {
		}
	}
	Member getMember(String email){
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = MEMBER;
		try {
			con = ds.getConnection();
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, email);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				long seq = rs.getLong(1);
				String name = rs.getString(2);
				//String email = rs.getString(3);
				String pwd = rs.getString(4);
				String phone = rs.getString(5);
				Date rdate = rs.getDate(6);
				Date udate = rs.getDate(7);
				
				return new Member(seq, name, email, pwd, phone, rdate, udate);
			}else {
				return null;
			}
		}catch(SQLException se) {
			return null;
		}finally {
			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(con != null) con.close();
			}catch(SQLException se) {}
		}
	}
}
  1. id/pwd 두 가지 정보를 받을 때 해당 ID가 맞는지, PWD가 맞는지만 확인하면 되니 불린형을 써야 할 것 같지만 int를 쓰는데, 그 이유는 int로 할 경우 여러가지 수를 리턴할 수 있게 되기 때문이다. 일단, 그 int를 받기 위해 상수로 지정해둘 LoginCase.java를 생성해준다.
package login.mvc.model;

public class LoginCase {
	public static final int NO_ID = 1;
	public static final int NO_PWD = 2;
	public static final int PASS = 3;
}
  1. LoginCase를 기반으로 login.mvc.model내 LoginService를 생성해준다.
package login.mvc.model;

import static login.mvc.model.LoginCase.*;
import mvc.domain.Member;

public class LoginService {
	private LoginDAO dao;
	private static final LoginService instance = new LoginService();
	private LoginService() {
		dao = new LoginDAO();
	}
	public static LoginService getInstance() {
		return instance;
	}
	
	public int checkMember(String email, String pwd) {
		Member m = dao.getMember(email);
		if(m == null) {
			return NO_ID;
		}else {
			String pwdDb = m.getPwd();
			if(pwdDb != null) pwdDb = pwdDb.trim();
			if(!pwd.equals(pwdDb)) {
				return NO_PWD;
			}else {
				return PASS;
			}
		}
	}
	
	public Member getMemberS(String email) {
		Member m = dao.getMember(email);
		m.setPwd(""); // for 보안성
		return m;
	}
}
  1. 이 모든 것을 연결해줄 Controller가 필요하다. login.mvc.control내 LoginController.java를 만들어주자!
package login.mvc.control;

import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 board.mvc.model.BoardService;
import board.mvc.vo.ListResult;
import login.mvc.model.LoginCase;
import login.mvc.model.LoginService;
import mvc.domain.Board;
import mvc.domain.Member;
import oracle.net.ano.Service;

@WebServlet("/login/login.do")
public class LoginController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	private String m = "";
	public void service(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		m = request.getParameter("m");
		if(m != null) {
			m = m.trim();
			if(m.equals("form")) {
				form(request, response);
			}else if(m.equals("check")) {
				check(request, response);
			}else if(m.equals("out")){
				out(request, response);
			}else {
				response.sendRedirect("../index.do");
			}
		}else {
			response.sendRedirect("../index.do");
		}
	}
	private void form(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String view = "login_form.jsp";
		response.sendRedirect(view);
	}
	private void check(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		String email = request.getParameter("email");
		String pwd = request.getParameter("pwd");
		if(email != null) email = email.trim();
		if(pwd != null) pwd = pwd.trim();
		
		LoginService service = LoginService.getInstance();
		int rCode = service.checkMember(email, pwd);
		request.setAttribute("rCode", rCode);
		
		if(rCode == LoginCase.PASS) {
			HttpSession session = request.getSession();
			Member m = service.getMemberS(email);
			session.setAttribute("loginPassUser", m);
		}
		
		String view = "login_msg.jsp";
		RequestDispatcher rd = request.getRequestDispatcher(view);
		rd.forward(request, response);
	}
	private void out(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		HttpSession session = request.getSession();
		//session.removeAttribute("loginPassUser");
		session.invalidate(); 
		
		String view = "../index.do";
		response.sendRedirect(view);
	}
}
  1. 로그인 시 분기처리를 해서 로그인 성공, 실패 여부를 눈에 보이게 만들어주는 msg.jsp를 만들어준다.
<%@page import="login.mvc.model.LoginCase"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<script>
   if(${rCode} == <%=LoginCase.NO_ID%>){
	   alert("로긴 실패( 없는 아이디 )");
   }else if(${rCode} == <%=LoginCase.NO_PWD%>){
	   alert("로긴 실패( 틀린 비번 )");
   }else{
	   alert("로긴 성공");
   }
   
   location.href="../index.do";
</script>

jsp:include와 <%@ include%>의 차이

jsp:include

<jsp:include page="/jsp/common/uppermenu.jsp" flush="true"> </jsp:include>

  • 동적인 include문
  • 부모 jsp가 java -> class -> html 문서로 수정되어 실행되어 질 시점에 삽입된 후 웹 브라우저로 렌더링 된다.

<%@ include%>

<%@include file="/jsp/common/session.jsp"%>

  • 정적인 include문
  • jsp 파일이 java 파일로 수정되기 전에 session.jsp 파일의 모든 내용이 부모의 jsp 로 include 된다. 그 후에 부모의 jsp는 java -> class 파일 -> html 문서 -> 웹 브라우저로 렌더링 된다.
profile
휘발방지

0개의 댓글