ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 11. 웹 페이지 연결 기능
    개발자 수업/JSP 2021. 12. 3. 11:33

    1. HTTP 프로토콜
        1) 서버-클라이언트 통신시 stateless 방식으로 통신함
        2) 브라우저에서 새 웹 페이지를 열면 기존의 웹 페이지나 서블릿에 관한 어떤 연결도 알 수 없음
            - 이전 웹 페이지들이 수행한 작업을 다른 웹 페이지에서 알 수 없음
        3) 웹 페이지간의 연결 기능을 필요로 함
            - <hidden> 태그
            - 쿠키와 세션

     

    2. 쿠키를 이용한 웹 페이지 연동
        1) 쿠키(Cookie)
            - 웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해놓고 사용하는 방법
        2) 쿠키의 특징
            - 정보가 클라이언트 PC에 저장됨
            - 저장 정보 용량에 제한이 있음 (파일 용량은 4kb)
            - 보안이 취약함
            - 클라이언트 브라우저에서 사용 유무를 설정할 수 있음
            - 웹 사이트(도메인)당 하나의 쿠키가 만들어짐
        3) 쿠키의 종류
            속성            Persistence 쿠키                Session 쿠키
            생성위치        파일로 생성                     브라우저 메모리에 생성
            종료시기        쿠키를 삭제하거나               브라우저를 종료한 경우
                            쿠키 설정 값이 종료된 경우
            최초 접속시
            전송여부        최초 접속시 서버로 전송          최초 접속시 서버로 전송되지 않음
            용도            로그인 유무 또는 팝업창을        사이트 접속시 Session 인증 정보를
                            제한할 때                       유지할 때
        4) 쿠키 API
            - javax.servlet.http.Cookie
                - HttpServletResponse의 addCookie()
                    - 클라이언트 브라우저에 쿠키를 전송한 후 저장함
                - HttpServletRequest의 getCookie()
                    - 쿠키를 서버로 가져옴
        5) 쿠키 이용해 팝업창 제한하기

    3. 세션(Session)을 이용한 웹 페이지 연동
        1) 세션
            - 웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해놓고 사용하는 방법
        2) 세션의 특징
            - 정보가 서버의 메모리에 저장
            - 브라우저의 세션 연동은 세션 쿠키를 이용함
            - 쿠키보다 보안에 유리
            - 서버에 부하를 줄 수 있음
            - 브라우저(사용자)당 한 개의 세션(세션 id)이 생성됨
            - 세션은 유효 시간을 가짐 (기본 유효 시간은 30분)
            - 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용됨
        3) 세션 얻는 방법
            - HttpSession 클래스 객체를 생성해서 사용함
            - HttpServletRequest의 getSession() 메서드를 호출해서 얻음
                - getSession() : 기존의 세션 객체가 존재하면 반환하고 없으면 새로 생성
        4) 세션 강제로 삭제하기

     


    package kr.co.ezenac.hidden;
    
    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("/login")
    public class LoginServlet extends HttpServlet{
    	
    	@Override
    	public void init() throws ServletException {
    		System.out.println("init 메서드 호출");
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		String user_id = request.getParameter("user_id");
    		String user_pw = request.getParameter("user_pw");
    		
    		//hidden 속성으로 전송된 값을 getParameter() 이용해 가져옴
    		String user_address = request.getParameter("user_address");
    		String user_email = request.getParameter("user_email");
    		String user_phone = request.getParameter("user_phone");
    		
    		String data = "안녕하세요.<br> 로그인하셨습니다.<br><br>";
    		data += "<html><body>";
    		data += "아이디 : " + user_id;
    		data += "<br>";
    		data += "비밀번호 : " + user_pw;
    		data += "<br>";
    		data += "주소 : " + user_address;
    		data += "<br>";
    		data += "이메일 : " + user_email;
    		data += "<br>";
    		data += "전화번호 : " + user_phone;
    		data += "<br>";
    		data += "</body></html>";
    		out.print(data);
    		
    	}
    	
    	@Override
    	public void destroy() {
    		System.out.println("destroy 메서드 호출");
    	}
    }
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>로그인 창</title>
    </head>
    <body>
    	<form name="frmLogin" method="post" action="login" enctype="UTF-8">
    		아이디 : <input type="text" name="user_id"><br>
    		비밀번호 : <input type="password" name="user_pw"><br>
    		<input type="submit" value="로그인">
    		<input type="reset" value="다시 입력">
    		<input type="hidden" name="user_address" value="서울시 서초구">
    		<input type="hidden" name="user_email" value="ezen@gmail.com">
    		<input type="hidden" name="user_phone" value="010-1599-2022">
    	</form>
    </body>
    </html>

     


    package kr.co.ezenac.hidden02;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    
    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("/login2")
    public class LoginServlet extends HttpServlet{
    	
    	@Override
    	public void init() throws ServletException {
    		System.out.println("init 메서드 호출");
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		String user_id = request.getParameter("user_id");
    		String user_pw = request.getParameter("user_pw");
    		
    		//hidden 속성으로 전송된 값을 getParameter() 이용해 가져옴
    		String user_address = request.getParameter("user_address");
    		String user_email = request.getParameter("user_email");
    		String user_phone = request.getParameter("user_phone");
    		
    		String data = "안녕하세요.<br> 로그인하셨습니다.<br><br>";
    		data += "<html><body>";
    		data += "아이디 : " + user_id;
    		data += "<br>";
    		data += "비밀번호 : " + user_pw;
    		data += "<br>";
    		data += "주소 : " + user_address;
    		data += "<br>";
    		data += "이메일 : " + user_email;
    		data += "<br>";
    		data += "전화번호 : " + user_phone;
    		data += "<br>";
    		
    		out.print(data);
    		
    		//GET 방식으로 한글을 전송하기 위해 인코딩함
    		user_address = URLEncoder.encode(user_address, "utf-8");
    		//<a> 태그를 이용해 링크 클릭시 서블릿 /second2로 로그인 정보가 전송됨
    		out.print("<a href='/chap06_Servlet/second2?user_id=" + user_id + "&user_pw=" + user_pw + "&user_address=" + user_address +"'>두 번째 서블릿으로 보내기</a>");
    		
    		data += "</body></html>";
    
    		
    	}
    	
    	@Override
    	public void destroy() {
    		System.out.println("destroy 메서드 호출");
    	}
    }
    package kr.co.ezenac.hidden02;
    
    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("/second2")
    public class SecondServlet extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//첫 번째 서블릿에서 전송한 데이터 중 ID, 비밀번호를 가져왔다면
    		//이미 첫 번째 서블릿에서 로그인 한 것이므로 로그인 상태가 유지하도록 해줌
    		
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		//첫 번째 서블릿에서 전송한 로그인 정보를 가져옴
    		String user_id = request.getParameter("user_id");
    		String user_pw = request.getParameter("user_pw");
    		String user_address = request.getParameter("user_address");
    		
    		out.println("<html><body>");
    		if(user_id != null && user_id.length() != 0) {
    			//첫 번째 서블릿의 ID 정보를 이용해 로그인 상태를 유지함
    			out.println("이미 로그인 상태입니다. <br><br>");
    			out.println("첫 번째 서블릿에서 넘겨준 아이디 : " + user_id + "<br>");
    			out.println("첫 번째 서블릿에서 넘겨준 비밀번호 : " + user_pw + "<br>");
    			out.println("첫 번째 서블릿에서 넘겨준 주소 : " + user_address + "<br>");
    			out.println("</body></html>");
    		} else {
    			//로그인 창을 거치지 않고 바로 요청한 경우 -> 다시 로그인 창으로 이동하도록 안내
    			out.println("로그인 하지 않았습니다. <br><br>");
    			out.println("다시 로그인하세요.<br>");
    			out.println("<a href='/chap06_Servlet/login.html'>로그인 창으로 이동하기</a>");
    		}
    		
    	}
    }
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>로그인 창</title>
    </head>
    <body>
    	<form name="frmLogin" method="post" action="login2" enctype="UTF-8">
    		아이디 : <input type="text" name="user_id"><br>
    		비밀번호 : <input type="password" name="user_pw"><br>
    		<input type="submit" value="로그인">
    		<input type="reset" value="다시 입력">
    		<input type="hidden" name="user_address" value="서울시 서초구">
    		<input type="hidden" name="user_email" value="ezen@gmail.com">
    		<input type="hidden" name="user_phone" value="010-1599-2022">
    	</form>
    </body>
    </html>


    package kr.co.ezenac.cookie;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLEncoder;
    import java.util.Date;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/set")
    public class SetCookieValue extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		Date d = new Date();
    		//Cookie 객체를 생성한 후 cookieTest 이름으로 한글정보 값으로 인코딩해서 쿠키에 저장
    		Cookie c = new Cookie("cookieTest", URLEncoder.encode("Servlet 프로그래밍입니다.", "utf-8"));
    		//c.setMaxAge(24*60_60);	//유효 기간을 설정(하루)
    		c.setMaxAge(-1);			//유효 시간을 음수로 지정하여 Session 쿠키를 만듦
    		response.addCookie(c); 	//생성된 쿠키를 브라우저로 전송함
    		
    		out.print("현재 시간 : " + d);
    		out.print("<br>현재 시간을 Cookie로 저장합니다.");
    	}
    }
    package kr.co.ezenac.cookie;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.URLDecoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/get")
    public class GetCookieValue extends HttpServlet{
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		//브라우저에게 쿠키 정보를 요청한 후 쿠키 정보를 배열로 가져옴
    		Cookie[] allValues = request.getCookies();
    		for(int i=0; i<allValues.length; i++) {	//배열에서 저장할 때 사용한 쿠키 이르밍 cookieTest 검색해 쿠키 값 가져옴
    			if(allValues[i].getName().equals("cookieTest")) {
    				out.println("<h2>Cookie 값 가져오기 : " + URLDecoder.decode(allValues[i].getValue(), "utf-8") + "</h2>");
    			}
    		}
    	}
    }


    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>자바스크립트에서 쿠키 사용</title>
    	<script type="text/javascript">
    		window.onload = pageLoad;	//브라우저에 웹 페이지 로드될 때 pageLoad() 함수 호출해서 실행함
    		
    		function pageLoad() {
    			notShowPop = getCookieValue();	//notShowPop의 쿠키값을 얻어옴
    			
    			if(notShowPop != "true") {		//notShowPop의 값이 ture가 아니면 -> 팝업창을 나타냄
    				window.open("popUp.html", "pop", "width=400, height=500, history=no, resizable=no, status=no, scrollbars=yes, menubar=no");
    			}
    		}
    		
    		//쿠키 값 읽어오는 함수
    		function getCookieValue() {
    			var result = "false";
    			if(document.cookie != "") {
    				//document의 cookie 속성으로 쿠키 정보를 문자열로 가져온 후 세미콜론(;)으로 분리해 각각의 쿠키를 얻음
    				cookie = document.cookie.split(";");
    				for(var i=0; i<cookie.lenght; i++) {
    					element = cookie[i].split("=");
    					value = element[0];
    					value = value.replace(/^\s*/, '');	//정규식을 이용해 쿠키 이름 문자열의 공백(\s)을 제거함
    					if(value == "notShowPop") {
    						result = element[1];			//쿠키 이름이 notShowPop이면 해당 쿠키 값을 가져와 반환함
    					}
    				}
    			}
    			return result;
    		}
    		
    		//'쿠키삭제' 클릭시 호출됨
    		//notShowPop 쿠키 값을 false로 설정함
    		function deleteCookie() {
    			document.cookie = "notShowPop=" + "false" + ";path=/; expires=-1";
    		}
    	</script>
    </head>
    <body>
    	<form action="#">
    		<input type="button" value="쿠키삭제" onclick="deleteCookie()">
    	</form>
    </body>
    </html>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>Insert title here</title>
    	<script type="text/javascript">
    		function setPopUpStart(obj) {
    			if(obj.checked == true) {
    				var expireDate = new Date();
    				var days = 1;
    				expireDate.setDate(expireDate.getDate() + days);
    				document.cookie = "notShowPop=" + "true" + ";path=/; expires=" + expireDate.toGMTString();
    			}
    		}
    	</script>
    </head>
    <body>
    	알림 팝업창입니다.
    	<br><br><br><br><br><br><br>
    	<form action="#">
    		<input type="checkbox" onclick="setPopUpStart(this)">오늘 더이상 팝업창 띄우지 않기
    	</form>
    </body>
    </html>


    package kr.co.ezenac.session;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    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;
    
    @WebServlet("/sess")
    public class SessionTest extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		//최초 요청시 세션 객체를 새로 생성하거나 기존 세션을 반환함
    		HttpSession session = request.getSession();
    		//생성된 세션 객체의 id를 가져옴
    		out.print("세션 아이디 : " + session.getId() + "<br>");
    		//최초 세션 객체 생성 시간을 가져옴
    		out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
    		out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
    		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
    		
    		//최초 생성된 세션인지 판별함
    		if(session.isNew()) {
    			out.print("새 세션이 만들어졌습니다.");
    		}
    	}
    }


    package kr.co.ezenac.session02;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    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;
    
    @WebServlet("/sess2")
    public class SessionTest extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		//최초 요청시 세션 객체를 새로 생성하거나 기존 세션을 반환함
    		HttpSession session = request.getSession();
    		//생성된 세션 객체의 id를 가져옴
    		out.print("세션 아이디 : " + session.getId() + "<br>");
    		//최초 세션 객체 생성 시간을 가져옴
    		out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
    		out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
    		
    		//톰캣 기본 세션 유효 시간을 출력함
    		out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
    		session.setMaxInactiveInterval(5);		//세선의 유효 시간을 5초로 설정
    		
    		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
    		
    		//최초 생성된 세션인지 판별함
    		if(session.isNew()) {
    			out.print("새 세션이 만들어졌습니다.");
    		}
    	}
    }


    package kr.co.ezenac.session03;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Date;
    
    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;
    
    @WebServlet("/sess3")
    public class SessionTest extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		//최초 요청시 세션 객체를 새로 생성하거나 기존 세션을 반환함
    		HttpSession session = request.getSession();
    		//생성된 세션 객체의 id를 가져옴
    		out.print("세션 아이디 : " + session.getId() + "<br>");
    		//최초 세션 객체 생성 시간을 가져옴
    		out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
    		out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
    		
    		//톰캣 기본 세션 유효 시간을 출력함
    		out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
    		session.setMaxInactiveInterval(5);		//세선의 유효 시간을 5초로 설정
    		
    		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
    		
    		//최초 생성된 세션인지 판별함
    		if(session.isNew()) {
    			out.print("새 세션이 만들어졌습니다.");
    		}
    		
    		session.invalidate();		//생성된 세션 객체를 강제로 삭제함
    	}
    }


    //xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
      Licensed to the Apache Software Foundation (ASF) under one or more
      contributor license agreements.  See the NOTICE file distributed with
      this work for additional information regarding copyright ownership.
      The ASF licenses this file to You under the Apache License, Version 2.0
      (the "License"); you may not use this file except in compliance with
      the License.  You may obtain a copy of the License at
    
          http://www.apache.org/licenses/LICENSE-2.0
    
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
    --><!-- The contents of this file will be loaded for each web application --><Context>
    
        <!-- Default set of monitored resources. If one of these changes, the    -->
        <!-- web application will be reloaded.                                   -->
        <WatchedResource>WEB-INF/web.xml</WatchedResource>
        <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
        <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
        <!-- Uncomment this to disable session persistence across Tomcat restarts 
        	톰캣이 메모리에서 삭제되지 않는 경우가 있으므로 아래 부분을 주석 해제해야 함-->
       
        <Manager pathname="" />
        
        
        <!-- 
        	name="jdbc/oracle" : DataSource에 접근함
         -->
        
        <Resource 
        	name="jdbc/oracle"
        	auth="Container"
        	type="javax.sql.DataSource"
        	driverClassName="oracle.jdbc.driver.OracleDriver"
        	url="jdbc:oracle:thin:@localhost:1521:XE"
        	username="wdsql"
        	password="0311"
        	maxActive="50"
        	maxWait="-1"
        />
        
    </Context>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>로그인</title>
    </head>
    <body>
    	<form name="frmLogin" method="post" action="login3" enctype="utf-8">
    		아이디 : <input type="text" name="user_id"><br>
    		비밀번호 : <input type="password" name="user_pw"><br>
    		<input type="submit" value="로그인">
    		<input type="reset" value="다시 입력">
    	</form>
    </body>
    </html>
    package kr.co.ezenac.session04;
    
    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;
    
    @WebServlet("/login3")
    public class SessionTest extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandle(request, response);
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandle(request, response);
    	}
    
    	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		HttpSession session = request.getSession();
    		
    		//로그인 창에서 전송된 ID와 비밀번호를 가져옴
    		String user_id = request.getParameter("user_id");
    		String user_pw = request.getParameter("user_pw");
    		
    		//최초 요청시 수행함
    		if(session.isNew()) {
    			if(user_id != null) {	//로그인 창에서 서블릿으로 요청했음
    				session.setAttribute("user_id", user_id);	//세선에 ID를 바인딩함
    				out.println("<a href='login3'>로그인 상태 확인</a>");
    			}
    		} else {	//재요청시 세션에서 ID를 가져옴
    			user_id = (String)session.getAttribute("user_id");
    			if(user_id != null && user_id.length() != 0) {
    				out.print("안녕하세요 " + user_id + "님");
    			} else {
    				out.println("<a href='login2.html'>다시 로그인 하세요</a>");
    				session.invalidate();
    			}
    		}
    	}
    }

     


    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="UTF-8">
    	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<title>로그인</title>
    </head>
    <body>
    	<form name="frmLogin" method="post" action="login5" enctype="utf-8">
    		아이디 : <input type="text" name="user_id"><br>
    		비밀번호 : <input type="password" name="user_pw"><br>
    		<input type="submit" value="로그인">
    		<input type="reset" value="다시 입력">
    	</form>
    </body>
    </html>
    package kr.co.ezenac.session05;
    
    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;
    
    @WebServlet("/login5")
    public class LoginServlet extends HttpServlet{
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandle(request, response);
    	}
    	
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doHandle(request, response);
    	}
    
    	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		request.setCharacterEncoding("utf-8");
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		//로그인 창에서 전송된 ID와 비밀번호를 가져옴
    		String user_id = request.getParameter("user_id");
    		String user_pw = request.getParameter("user_pw");
    		
    		MemberVO memberVO = new MemberVO();
    		memberVO.setId(user_id);
    		memberVO.setPwd(user_pw);
    		
    		MemberDAO dao = new MemberDAO();
    		boolean result = dao.isExisted(memberVO);
    		
    		if(result) {
    			HttpSession session = request.getSession();
    			session.setAttribute("isLogon", true);
    			session.setAttribute("login.id", user_id);
    			session.setAttribute("login.pwd", user_pw);
    			
    			out.print("<html><body>");
    			out.print("안녕하세요. " + user_id + "님 <br>");
    			out.print("<a href='show'>회원정보보기</a>");
    			out.print("</body></html>");
    		} else {
    			out.print("<html><body>");
    			out.print("회원 아이디가 틀립니다. <br>");
    			out.print("<a href='login3.html'>다시 로그인하기</a>");
    			out.print("</body></html>");
    		}
    		
    	}
    }
    package kr.co.ezenac.session05;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.sql.DataSource;
    
    public class MemberDAO {
    	
    	private Connection conn;
    	private PreparedStatement pstmt;
    	private DataSource dataFactory;
    	
    	public MemberDAO() {
    		try {
    			Context ctx = new InitialContext();
    			Context envContext = (Context)ctx.lookup("java:/comp/env");		//JNDI에 접근하기 위해 기본경로를 지정
    			//톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
    			dataFactory = (DataSource)envContext.lookup("jdbc/oracle");		
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> list = new ArrayList<MemberVO>();
    		
    		try {
    			conn = dataFactory.getConnection();	//DataSource를 이용해 DB에 연결함
    			
    			String query = "SELECT * FROM T_MEMBER";
    			System.out.println(query);
    			
    			pstmt = conn.prepareStatement(query);	//prepareStatement()메서드에 SQL문을 전달해 객체 생성함
    			ResultSet rs = pstmt.executeQuery();	//미리 설정한 SQL문을 실행함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				list.add(vo);							//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return list;				//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
    	}
    	
    	public void addMember(MemberVO memberVO) {
    		try {
    			conn = dataFactory.getConnection();		// DataSource를 이용해 DB 연결
    			
    			String id = memberVO.getId();			// 테이블에 저장할 회원 정보 받아옴
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			
    			String query = "insert into t_member (id, pwd, name, email) values (?, ?, ?, ?)";
    			System.out.println("prepareStatement: " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			
    			pstmt.setString(1, id);					//insert문의 ?에 순서대로 회원 정보 세팅
    			pstmt.setString(2, pwd);
    			pstmt.setString(3, name);
    			pstmt.setString(4, email);
    			
    			pstmt.executeUpdate();
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void delMember(String id) {
    		try {
    			conn = dataFactory.getConnection();
    			
    			String query = "DELETE FROM T_MEMBER tm WHERE ID = ?";	//delete문을 문자열로 만듦
    			System.out.println("prepareStatement : " + query);
    			
    			pstmt = conn.prepareStatement(query);
    			pstmt.setString(1, id);		//첫 번째 '?'에 전달된 ID를 인자로 넣음
    			pstmt.executeUpdate();		//delete문 실행 -> 테이블에서 해당 ID 회원 정보 삭제
    			pstmt.close();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public boolean isExisted(MemberVO memberVO) {
    		boolean result = false;
    		
    		String id = memberVO.getId();
    		String pwd = memberVO.getPwd();
    		
    		try {
    			conn = dataFactory.getConnection();
    			//decode() 함수를 이용해 조회하여 ID와 비밀번호가 테이블에 존재하면 true를,
    			//존재하지 않으면 false를 리턴함
    			String query = "SELECT DECODE(COUNT(*), 1, 'true', 'false') AS RESULT FROM T_MEMBER";
    			query += " WHERE id=? AND pwd=?";
    			
    			//메서드로 전달된 ID와 비밀번호를 이용해 SQL문을 작성한 후 DB에 조회함
    			pstmt = conn.prepareStatement(query);
    			pstmt.setString(1, id);
    			pstmt.setString(2, pwd);
    			ResultSet rs = pstmt.executeQuery();
    			
    			rs.next();			//커서를 첫 번째 레코드로 위치시킴
    			result = Boolean.parseBoolean(rs.getString("result"));
    			System.out.println("result = " + result);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		
    		return result;
    	}
    	
    }
    package kr.co.ezenac.session05;
    
    import java.sql.Date;
    
    /*
     	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
     */
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	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 Date getJoinDate() {
    		return joinDate;
    	}
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    }
    package kr.co.ezenac.session05;
    
    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;
    
    @WebServlet("/show")
    public class ShowMember extends HttpServlet{
    	
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		String id="", pwd="";
    		boolean isLogon = false;
    		
    		HttpSession session = request.getSession(false);
    		
    		if(session != null) {
    			isLogon = (boolean)session.getAttribute("isLogon");
    			if(isLogon == true) {
    				id = (String)session.getAttribute("login.id");
    				pwd = (String)session.getAttribute("login.pwd");
    				
    				out.print("<html><body>");
    				out.print("아이디 : " + id + "<br>");
    				out.print("비밀번호 : " + pwd + "<br>");
    				out.print("</body></html>");
    			} else {
    				response.sendRedirect("login3.html");
    			}
    		} else {
    			response.sendRedirect("login3.html");
    		}
    	}
    }

     

     

    '개발자 수업 > JSP' 카테고리의 다른 글

    13. 필터 API  (0) 2021.12.06
    12. 서블릿 스코프, URL 패턴  (0) 2021.12.06
    10. ServletConfig  (0) 2021.12.03
    9. ServletContext  (0) 2021.12.02
    8. 서블릿 API 사용하기2  (0) 2021.12.02

    댓글