모도리는 공부중

21.01.12. JSP&Servlet - Cookie, Session 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/JAVA

21.01.12. JSP&Servlet - Cookie, Session

공부하는 모도리 2021. 1. 12. 16:18
728x90
반응형

저번시간 복습

 

Cookie의 특징

  • 문자만 넣을 수 있다.
  • 보안에 매우 취약
  • 개수가 한정적 (한 도메인당 24개)
    → 실제로 많이 쓰이지는 않음

Session의 특징

  • ☆ 서버의 (Session)영역에 저장
  • ☆ Object 저장 (업캐스팅 현상)
  • Cookie보다 보안에 강력
  • ☆ 브라우저당 1개만 발급
  • 많은 양의 데이터 저장 가능 (서버가 허용하는 한)

 

cookie에 나이를 따로 주지 않으면 기본 설정은 1년이지만 브라우저를 종료하게 되면 사라진다. 하지만 cookie에 나이를 설정해주게 되면 브라우저를 종료하더라도 다시 실행했을 때 여전히 남아있는 것을 우리는 확인할 수 있었다.

 

session은 서버에 저장되다보니 session이 많아지면 많아질수록 용량이 커진다. 이러한 이유로 session은 기본적으로 나이를 따로 설정해주지 않으면 30분만 살아있다. 그리고 session도 마찬가지로 브라우저를 껐다가 켜면 모두 삭제된다.

session도 나이를 설정할 수 있다. ex) 금융페이지 - 5분 지나면 자동 종료되도록 설정된 것이 이와 같은 현상.

 

내 정보는 session에 저장되어있고, session에 대한 위치를 cookie에 저장한다. 고유한 값으로 두기 위해(중복현상 제거).

이것을 잘 설명한 유튜버의 영상을 하나 보고 가도록 합시다.

 


오늘도 새로운 프로젝트를 생성해서 시작해봅시다.

 

Dynamic Web Project : Session

 

Java Resources - src 폴더에 MakeSession.java라는 서블릿 생성.

 

package com;

import java.io.IOException;
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("/MakeSession")
public class MakeSession extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String name = "모도리";
		
/*		Session의 특징은 브라우저당 1개. 브라우저에 관련된 녀석.
		서버에서는 a인지 b인지 c인지 판별하기 위해 각각 클라이언트에게 쿠키에 키를 넣어서 전달한다.
		클라이언트는 서버에서 정보를 꺼내볼 때 각 쿠키만 꺼내면 가능하다.	*/
		
		HttpSession session = request.getSession();
//		request.get을 통해 세션객체 반환
		
//		세션은 요청한 클라이언트에서 값을 먼저 가져온 다음, 없으면 만들어준다.
		session.setAttribute("name", name);
/*		setAttribute를 통해 저장. name은 무조건 문자열(String)로 저장되며 뒤에 오는 value는 object로 저장된다.
		모든 클래스는 object를 상속받기 때문에 부모타입인 object로 형변환이 가능하다. 이러한 현상을 upcasting이라고 부른다.
		결국 value자리에 object자료형을 사용하는 이유는 어떠한 자료형이 들어와도 사용이 가능하게 하기 위함이다.	*/
		
	}

}

Java 데이터 타입

기본 자료형은 클래스형이 아니라서 업캐스팅이 되지 않는다. 그렇기 때문에 기본 자료형들을 클래스화해서 만들어놓은게 있다.

기본 자료형 8개 (Integer(우리가 유일하게 대문자로 쓰지 않고 int라는 소문자로 사용할 수 있는 형식), Double, Float, Boolean) -> 이렇게 레퍼런스 형태로 만들 수 있다.
그래서 저기에 쓰면 Integer 클래스의 객체로 인식한다. (이런 애들을 Wrapper Class라고 한다)

 

 

SelectSession.java 서블릿 파일 생성.

package com;

import java.io.IOException;
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("/SelectSession")
public class SelectSession extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		HttpSession session = request.getSession();
		String name = (String) session.getAttribute("name");
/*		session.getAttribute("name");에 빨간줄 발생. why? getAttribute는 object타입이기 때문에 타입에러가 발생하는 것.
		자료형을 맞춰주기 위해 object를 String인 자식타입으로 바꿔줘야한다. 이것이 바로 다운캐스팅.
		(String) session.getAttribute("name");으로 강제형변환(down casting)을 해주면 문제없이 String타입의 name변수에 선언되는 것을 확인할 수 있다.	*/
		System.out.println(name);
		
	}

}

 

지금까지 만들었던 loginService 파일로 돌아가서 이제 세션을 활용할 수 있게 해주자.

우리가 바꿔줄 라인은 if(nickname != null)문인 로그인 성공시 이어지는 코드 부분.

if(nickname != null){
	System.out.print("로그인 성공");
//	response.sendRedirect("loginSuccess.jsp?name="+URLEncoder.encode(nickname,"EUC-KR"));
	// ? : url의 끝을 알리면서 데이터표현의 시작점을 알리는 기호.
//	21.01.12. 로그인 성공시 session에 nick이라는 이름으로 닉네임을 저장하시오.
	HttpSession session = request.getSession();
	session.setAttribute("nick", nickname);
	response.sendRedirect("loginSuccess.jsp");
}else{
	System.out.print("회원가입 실패");
	response.sendRedirect("loginFail.jsp");
}

주석처리된 부분이 이전 수업때 사용했던 코드이며, 주석 밑에 추가된 HttpSession session쪽 3줄이 오늘 추가한 코드라인이다.

 

loginSuccess.jsp 파일도 수정해주도록 하자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<style type="text/css">
	div{
		text-align: center;
	}
</style>
</head>
<body>
	<div>
		<%
		// jsp에서 session은 내장객체로 존재한다.
		//	String nickname = request.getParameter("name"); ← 이제 이것은 사용안되니 주석처리하고,
		String nickname = (String)session.getAttribute("nick");
		%>
		<p><%=nickname %>님!</p>
		<p>오늘도 좋은 하루 되세요♪</p>
	</div>
</body>
</html>

아까 설명했듯이 session.getAttribute는 object타입이므로 String nickname변수에 넣어줄 수 있도록 down casting을 해주면 문제없이 실행될 것이다.

 


html에서 '정보보기'라는 버튼을 누르면 info.jsp가 session에 정보를 담아서 view.jsp에 띄워주도록 만들어보자.

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<a href="info">
		<button>정보보기</button>
	</a>
</body>
</html>

 

Info.jsp생성.

이름, 나이, 전화번호를 세션에 저장해야하는데 그럼 뭐가 필요할까? - vo.

vo는 java에서 부르는 이름이며, 우리는 이제부터 웹을 할 것이므로 웹용어인 dto라고 불러주도록 하자.

 

MemberDTO.java라는 클래스를 생성해주자.

package com;

public class MemberDTO {

	private String name;
	private int age;
	private String phone;
	
	
//	생성자 생성
	public MemberDTO(String name, int age, String phone) {
		this.name = name;
		this.age = age;
		this.phone = phone;
	}
	
//	getter and setter 생성
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	
}

 

아까 만들어준 info.java로 돌아가자.

package com;

import java.io.IOException;
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("/Info")
public class Info extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
//		이름, 나이, 전화번호 세션에 저장
//		우리가 지금까지 부른 vo를 웹에서는 dto라고 부른다. 이제부터는 dto라고 부르도록 하자.
		MemberDTO dto1 = new MemberDTO("모도리", 30, "010-2580-2580");
//		dto1내 정보를 session에 info라는 이름으로 저장하시오
		
		HttpSession session = request.getSession();
		session.setAttribute("info", dto1);
		
		response.sendRedirect("view.jsp");
	}

}

 

view.jsp로 보냈으니 해당 파일이 또 필요하겠지? WebContent폴더에서 해당 jsp파일을 만들어보자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!-- 세션에서 내 정보를 가져와서 jsp에 띄워주세요 -->
<%
	// 코드를 넣어주세요.
%>
이름 :
<br>
나이 :
<br>
전화번호 :

</body>
</html>

실습하고 다음 코드를 확인해보도록 합시다.

힌트 : jsp는 세션이 내장객체로 존재하기 때문에 따로 만들어줄 필요 없다.

 

<%@page import="com.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<!-- 세션에서 내 정보를 가져와서 jsp에 띄워주세요 -->
<%
	// 코드를 넣어주세요.
//	jsp는 세션이 내장객체로 존재하기 때문에 따로 만들어줄 필요가 없다.
	MemberDTO dto1 = (MemberDTO)session.getAttribute("info");
%>
이름 : <%= dto1.getName() %>
<br>
나이 : <%= dto1.getAge() %>
<br>
전화번호 : <%= dto1.getPhone() %>

</body>
</html>

 

다 만들었으면 해당 코드를 Ctrl + F11을 눌러서 실행해보자. 실행은 html에서.

전화번호는 임의의 번호입니다.

 

728x90
반응형
Comments