본문 바로가기
코딩도전기/JSP

CODO Day15_JSP(Out/Response/Cookie/Session)

by 코도꼬마 2023. 2. 21.

Out 객체

  • out 객체는 서버에서 페이지로 output Stream하는 기능을 한다.
  • 실제적으로는 페이지에 문자열을 출력하는 것 정도로만 사용

 

Response 객체

  • Response 객체는 요청에 대해 응답 페이지를 전달해 주는 객체
  • 페이지를 만드는(write) 객체라 out 객체처럼 출력이 가능
  • 특정 페이지로 이동하는 것도 가능
  • 데이터를 고객PC로 내려보내는 것도 가능
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p><a href="print.jsp">각 객체별 페이지 출력</a></p>
	<p><a href="redirect.jsp">response를 이용한 페이지 이동</a></p>
	
	<!-- redirect 활용 -->
	<form action="redirect.jsp" method="post">
		<input type="text" name="id" value=""/>
		<input type="submit" value="send"/>
	</form>
</body>
</html>

 

  • 페이지 출력하는 방법 3가지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- response의 기능 1 : 응답할 페이지를 그린다. -->

<%= "<p>첫번째, 스크립틀릿을 활용하는 방법</p>" %>


<%
	out.print("<p>두번째, out객체를 이용하는 방법</p>");
%>

<!-- response는 응답전용이기 때문에 가장 빠름 -->
<%
	response.getWriter().write("<p>세번째, response 객체를 이용하는 방법</p>");
%>

  • out은 response로부터 추출되어 나온 객체이기 때문에 순서가 느림
  • scriptlet(<%= %>) 출력문은 사실 out객체이기 때문에 동급일 때는 위에서 아래로 읽음
  • 여러개를 출력할 경우 한가지로 통일시켜서 출력(순서 바뀌지 않도록)

 

  • request.setCharacterEncoding("UTF-8");  :  입력받는 언어 설정(한글로 입력할 경우 깨질 수 있어 설정해줌)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>여기를 거쳐서 goToPage.jsp로 이동</h1>
<%
	//post방식으로 한글을 보내면 깨짐 / request를 UTF-8로 인코딩해줘야 함
	request.setCharacterEncoding("UTF-8");

	//index.jsp에서 보낸 id 값을 받아서 출력해보자
	String id = request.getParameter("id");
	System.out.println(id);
	
	//받아온 id값이 admin일 경우 goToPage.jsp로 보냄
	if(id.equals("admin")){
		response.sendRedirect("goToPage.jsp");		
	}else{//아닐 경우 index.jsp로 보냄
		response.sendRedirect("index.jsp");
	}	
%>

 

값을 받아서 이동할 경우 순식간에 지나가서 페이지가 보이지 않음

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>redirect.jsp를 거쳐서 이동된 페이지입니다.</h1>
</body>
</html>

 

 

 

내장객체 cookie & session

  • 웹에서 만들어지는 특정한 데이터를 저장하고 싶을 경우 cookiesession이라는 저장객체를 사용
  • 저장위치가 서로 다르므로 사용법과 보안 수준이 다름

 

Cookie

  • client PC에 저장 : 브라우저를 닫거나 서비스를 종료해도 정보가 남음  ex) 방문한 페이지 기록
  • 공공장소에서 사용하는 PC의 경우 쿠키에 저장된 내용을 누구든지 사용할 수 있음  =>  보안성 낮음
  • Java script로도 제어 가능
  • 헷갈려하는 것 중 자동로그인이 있는데 자동로그인 기능 만들 때 사용하지 않음

 

  • 쿠키 사용시간(수명) 지정  :  setMaxAge(초단위);   >>  시간지정 쉽게 하는 법 : 60(초)*n(분)*m(시간)*d(일)
  • 쿠키 저장 방법(고객 PC로 저장)  :  response.addCookie();
  • 쿠키 지우는 법 : setMaxAge(0);으로 설정
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//1.쿠키 객체화( ,나 - 등의 특수문자 사용x)
	Cookie cookie = new Cookie("name","hong_gil_dong");  //key, value
	//2.쿠키 수명(사용시간) 지정 
	cookie.setMaxAge(60*10); //초 단위(10분)
	//3.쿠키 저장(고객PC)
	response.addCookie(cookie);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<input type="button" value="쿠키부르기" onclick="location.href='cookieResult.jsp'"/>
	<br/>
	<a href="exam/infoinput.jsp">쿠키 사용 예시</a>

	<h2>쿠키 이름 : <%= cookie.getName() %></h2>
	<h2>쿠키 값 : <%= cookie.getValue() %></h2>
	<h2>쿠키 만료시간 : <%= cookie.getMaxAge() %></h2>
</body>
</html>

 

  • 쿠키 불러오기  :  request.getCookies(); (고객의 PC에 있는 쿠키를 불러와야하므로 request를 통해 가져와야 함)
  • 쿠키는 여러 개인 경우가 많아 배열로 받아옴
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] list = request.getCookies();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	for(Cookie c : list){
%>
		<p><%=c.getName()%> : <%=c.getValue()%></p>
<%
	}
%>
</body>
</html>

 

  • cookie 사용 예시
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>언어를 설정해주세요</h3>
	<form action="coocieSet.jsp" method="post">
		<input type="radio" name="lang" value="kor"/> 한국어
		<input type="radio" name="lang" value="eng"/> English
		<input type="submit" value="설정"/>
	</form>
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie[] list = request.getCookies();

	String name = "";
	String value = "";
	
	for(Cookie c : list){
		name = c.getName();
		if(name.equals("lang")){
			value = c.getValue();
		}
	}
	System.out.println("cookie value : " + value);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		if(value.equals("kor")){
	%>
		<h2>한글 페이지에 오신 것을 환영합니다.</h2>		
	<%}else{ %>
		<h2>Welcome to English Page</h2>
	<%		
		}
	%>
</body>
</html>

 

  • cookie 값 저장 & null 방어
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//1.페이지에서 보낸 lang 값을 받음
	String lang = request.getParameter("lang");

	//null은 발생하지 않는게 좋다. 하지만 발생한다면?
	//null 방어
	if(lang != null){
		//2.쿠키에 값을 저장
		Cookie cookie = new Cookie("lang",lang);
		cookie.setMaxAge(60*60*24); //하루
		response.addCookie(cookie);
		//3.다른 페이지로 보냄
		response.sendRedirect("cookieGet.jsp");
	}else{		
		response.sendRedirect("infoinput.jsp");
	}

	System.out.println(lang);
	
%>

console
Browser

 

 

 

Session

  • server에 저장
  • 서비스에서 나가거나 브라우저가 변경될 경우 끊김  ex) 로그인 & 로그인 후 저장되는 정보들
  • Server side program으로만 제어 가능
  • 보안성 높음
  • cookie보다 다루기가 편함

 

  • session.getMaxInactiveInterval(초단위);  :  세션 정보 저장 유지시간 지정(default : 30분)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//세션값 확인
	String name = (String)session.getAttribute("name");
	//유지시간(inactive)
	int age = session.getMaxInactiveInterval();
	//session의 ID
	String id = session.getId();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>SESSION</h2>
	<h3>세션의 name 값 : <%= name %></h3>
	<h3>세션의 유지시간 : <%= age %></h3>
	<h3>세션의 ID 값 : <%= id %></h3>
	<a href="sessionSet.jsp">세션 속성 저장</a>
	<a href="sessionDel.jsp">세션 속성 삭제</a>
	<a href="sessionInit.jsp">세션 초기화</a>
	<p><a href="exam/login.jsp"/>로그인 예제</p>
</body>
</html>

 

  • 세션 속성 저장
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	session.setAttribute("name", "dongly");  //String, Object(어떤 타입이든 넣을 수 있음)
	// 움직이지 않고 있을 때 유지되는 세션 시간(기본 30분)
	session.setMaxInactiveInterval(60*10); //초
	response.sendRedirect("index.jsp");
%>

 

  • 세션 속성 삭제
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//세션의 특정 속성을 지운 후
	session.removeAttribute("name");
	//index.jsp로 이동
	response.sendRedirect("index.jsp");
%>

 

  • 세션 초기화
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//세션 종료 -> 재생성(ID가 변경됨)
	session.invalidate();
	response.sendRedirect("index.jsp");
%>

session의 ID 값이 변경됨

 

  • login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	table, th, td{
		border : 1px solid black;
		border-collapse : collapse;
	}
	th, td{
		padding : 5px 10px;
	}
</style>
</head>
<body>
	<form action="result.jsp" method="post">
		<table>
			<tr>
				<th>ID</th>
				<td><input type="text" name="userId"/></td>
			</tr>
			<tr>
				<th>PW</th>
				<td><input type="text" name="userPw"/></td>
			</tr>
			<tr>
				<th colspan="2"><input type="submit" value="login"/></th>
			</tr>
		</table>
	</form>
</body>
</html>

 

  • result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//1.login.jsp로부터 userId와 userPw 값을 받는다.
	String id = request.getParameter("userId");                
	String pw = request.getParameter("userPw");     
	//System.out.println(id + "/" + pw);
	
	if(id == null || pw == null){                                           
		response.sendRedirect("login.jsp");
	}else{                                                    
		//2.받아온 id와 pw가 admin과 pass인지 확인한다.                 
		if(id.equals("admin") && pw.equals("pass")){		
				//4.일치하면 session에 loginId라는 이름으로 id 값을 저장한다.
				session.setAttribute("loginId", id);                      
				//5.현재 페이지에 머무른다.
		}else{  //3.일치하지 않으면 login.jsp로 보낸다.
			response.sendRedirect("login.jsp");                         
		}		
	}	
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>Login 성공 페이지</h3>                                 
	<div>
		안녕하세요 <%= session.getAttribute("loginId") %>님 
		<a href="logout.jsp">로그아웃</a>
	</div>
</body>
</html>

  • logiut.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//1.session에서 loginId가 null이 아니면 삭제
	if(session.getAttribute("loginId") != null){
		session.removeAttribute("loginId");
	}	
	//2.login.jsp로 보냄
	response.sendRedirect("login.jsp");
%>