브라우저는 http 프로토콜 통신규약으로 서버와 통신하게 되는데, 이때 페이지를 이동할 때마다 stateless 상태이다.

즉, 연결을 유지하는 것이 아니라, 클라이언트와 서버가 보내고 받고를 반복하는 것이라고 할 수있다.

먼저, 브라우저에서 서버로 정보를 보내는 방법을 알아보자.

 

- login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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="dongpani@gmail.com" />
       <input type="hidden" name="user_hp" value="010-1234-1212" />
  </form>
</body>
</html>
  • input 태그의 hidden 속성을 사용하여 값을 서블릿에 전송한다.

 

- LoginServlet.java

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
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 {

    public void init(ServletConfig config)  {
        System.out.println("init 메서드 호출");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    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");
        String user_address = request.getParameter("user_address");
        String user_email = request.getParameter("user_email");
        String user_hp = request.getParameter("user_hp");

        String data = "안녕하세요!<br> 로그인하셨습니다.<br><br>";
        data += "<html><body>";
        data += "아이디 : " + user_id;
        data += "<br>";
        data += "비밀번호 : " + user_pw;
        data += "<br>";
        data += "주소 : " + user_address;
        data += "<br>";
        data += "email : " + user_email;
        data += "<br>";
        data += "휴대 전화 : " + user_hp;
        data += "</html></body>";
        out.print(data);
    }

    @Override
    public void destroy() { // 객체가 소멸될 때 호출
        System.out.println("destroy 메서드 호출");
    }
}
  • 전송받은 파라미터를 출력한다.

 

브라우저의 값을 서블릿에 보냄.
브라우저에서 받은 정보를 출력



쿠키

쿠키란 사용자 정보를 클라이언트PC 에 저장하는 것을 의미하며, 이는 사용자가 쿠키정보를 허용할지 선택할 수 있다.
외부에 노출되는 값이므로 보안에 취약하다는 단점이 있다.

 

사용자 PC에 저장된 쿠키 확인하기 (크롬)

C:\Users\power\AppData\Local\Google\Chrome\User Data\Default\Cache

 

쿠키 API

- 서버에서 쿠키 생성하기.

package sec02.ex01;

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 {
	private static final long serialVersionUID = 1L;

	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 c = new Cookie("cookieTest", URLEncoder.encode("JSP프로그래밍입니다.", "utf-8"));
		
		c.setMaxAge(24 * 60 * 60);
        // c.setMaxAge(-1); // 세션 쿠키 (브라우저(
		response.addCookie(c);
		out.println("현재시간:" + d);
		out.println("<br> 문자열을 Cookie에 저장합니다." );	
		
	}
}

 

 

- 쿠키 출력하기

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
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("/get")
public class GetCookieValue  extends HttpServlet {
	private static final long serialVersionUID = 1L;

	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++) {
			if(allValues[i].getName().equals("cookieTest")) {
				out.println("<h2> Cookie 값 가져오기 : "+  URLDecoder.decode(allValues[i].getValue(), "utf-8") + " </h2>");
			}
		}		
	}
}

 

쿠기 생성

 

쿠키 출력

 

크롬 브라우저에서 쿠키정보 확인

 

 

하루동안 팝업창 보지 않기

 

- popupTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>자바스크립트에서 쿠키 사용</title>

<script>

	window.onload = pageLoad;
	
	function pageLoad() {
		noShowPop = getCookieValue();
		
		console.log('noShowPop: ', noShowPop);
		
		if(noShowPop != 'true') {
			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 != '') {
			cookie = document.cookie.split(';');
			for(var i=0; i < cookie.length; i++) {
				element = cookie[i].split('=');
				value = element[0];
				value=value.replace(/^\s*/,''); 
				if(value == 'noShowPop') {
					result = element[1];
				}
			}
		}
		return result;
	}
	
	function deleteCookie() {
		document.cookie = 'noShowPop=' + 'false' + ';path=/; expires=-1';
	}
	
</script>

</head>
<body>
	<form>
		<input type="button" value="쿠키삭제" onClick="deleteCookie()" /> 
	</form>	
</body>
</html>
  • 브라우저가 로드되자마자 쿠키를 읽어옴.
  • 쿠키 값에 따라 팝업 노출/미노출

 

- popUp.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<script>
function setPopUpStart(obj){
		
    if(obj.checked == true){
     var expireDate = new Date();
	 expireDate.setMonth(expireDate.getMonth() + 1);
	 document.cookie ="noShowPop=" +"true" + ";path=/; expires=" + expireDate.toGMTString();
     window.close();
    }
}
</script>

<title>Insert title here</title>
</head>
<body>
	알림 팝업창입니다.
	<br><br><br><br><br><br><br>
   <form>
    	<input type=checkbox  onClick="setPopUpStart(this)" >오늘 더 이상 팝업창 띄우지 않기   
   </form>	
</body>
</html>
  • "오늘 더 이상 팝업창 띄우지 않기" 탭을 누르면 쿠키 생성

 

체크박스를 클릭하면 쿠키에 저장됨.

 

 

 

세션

SESSION 은 쿠키와는 다르게 클라이언트정보가 사용자PC가 아닌, 서버에 저장된다. 그렇기에 쿠키보다는 보안성이 조금 더 높다는 장점이 있다.

 

세션생성과정

  1. (최초접속)브라우저가 서버에 들어왔다고 신호를 보낸다.
  2. 서버에서는 브라우저에게 세션키를 보내준다.
  3. 브라우저는 서버에게 받은 세션키를 자기자신의 "메모리"에 저장해둔다.
  4. 브라우저당 하나의 세션ID를 생성한다.

 

 

세션아이디로 로그인 바인딩

 

- login2.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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="다시입력">
  </form>
</body>
</html>

 

- SessionTest4.java

package sec03.ex04;

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("/login")
public class SessionTest4 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();
		
		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);
				out.println("<a href='login'>로그인 상태 확인</a>");
			}else {
				out.println("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}else {
			user_id = (String) session.getAttribute("user_id");
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!!!");
			} else {
				out.print("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}
		
	}
}

 

 

 

 

 

쿠키가 차단 되었을 때

 

브라우저에서 쿠키가 차단되었다면, 쿠키와 세션모두 사용할 수 없다. 그럴 때는 브라우저에서 세션ID를 받는 것이 아닌,반대로 서버에서 브라우저로 세션ID를 부여해야한다.

 

크롬브라우저에서 쿠키차단

 

 

- SessionTest

package sec04.ex01;

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("/login")
public class SessionTest5 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();
		
		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);
				String url = response.encodeURL("login");
				out.println("<a href=" + url + ">로그인 상태 확인</a>");
			}else {
				out.println("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}else {
			user_id = (String) session.getAttribute("user_id");
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!!!");
			} else {
				out.print("<a href='login2.html'> 다시 로그인 하세요!! </a>");
				session.invalidate();
			}
		}		
	}
}
  • response 객체의 encodeURL 메서드로 브라우저로 jsessesionid을 보낸다.

 

 

 

세션을 이용한 로그인 (데이터베이스 연동)

 

데이터베이스에 저장된 회원정보를 조회에 로그인하는 기능을 만들어보자.

 

login3.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<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_pwd"><br>
      <input type="submit" value="로그인">
      <input type="reset" value="다시입력">
  </form>
</body>
</html>

 

LoginServlet

package sec05.ex01;

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("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}


	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();
		String user_id = request.getParameter("user_id");
		String user_pwd = request.getParameter("user_pwd");
		
		MemberVO memberVO = new MemberVO();
		memberVO.setId(user_id);
		memberVO.setPwd(user_pwd);
		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_pwd);

			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("<a href='login3.html'> 다시 로그인하기</a>");
			out.print("</body></html>");			
		}
	}
}
  • 아이디와 패스워드를 입력하면 데이터베이스에서 회원정보를 조회해온다.
  • 회원정보가 있다면 세션을 저장한다.

 

ShowMember

package sec05.ex01;

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 {

	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 액션태그와 Bean  (0) 2020.02.07
서블릿 스코프, URL패턴, 필터  (0) 2020.01.30
서블릿 리다이렉트 와 바인딩  (0) 2019.12.26
서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
블로그 이미지

파니동

,