[jsp, servlet] cookie, application, session / 상태유지

seulki·2022년 10월 7일
0

jsp

목록 보기
11/51
post-thumbnail
post-custom-banner

🗝️ 상태유지의 필요성

  • application, session, cookie

🎈 session 알아보러가기!

🎈 application 알아보러가기!



  • 저장위치 : 클라이언트 (접속자 PC)
  • 저장형식 : text
  • 만료시점 : 쿠키 저장시 설정
    -> 브라우저가 종료되도, 만료시점이 지나지 않으면 자동 삭제가 되지 않음
  • 용량제한 : 하나의 도메인당 20개
  • 속도 : session보다는 빠르다
    -> 접속자의 PC에서 가져오기 때문에
  • 보안 : session 보다는 안좋다.

1. 요청이 들어온다.
     -> ex) 사용자가 처음 사이트에 방문
2. 서버가 저장하고자 하는 데이터를 쿠키에 담아서 응답을 한다.
     -> ex) 처음 방문한 사용자임을 파악하고,
               '사이트에 방문한 적이 있는 사람' 이라는 데이터를 같이 응답한다.
3. 사용자가 새로운 요청을 할 때 쿠키가 딸려온다.
     -> 사용자가 다시 요청을 보낼 때, 쿠키 데이터를 다시 가지고 온다.
          사이트는 이 데이터를 받아서 '처음 방문한 사용자가 아니다'를 파악한다.
4. 사용자 PC에 저장하고 있던 데이터를 가공한다.

  • cookie의 사용
    -> Cookie 객체 생성, Cookie는 배열로 반환 됨.
    Cookie[] cookies = arg0.getCookies();
    -> cookie 값 저장하기
          - cookie 객체 생성할 때, 생성자에 String, String만 가능
    //value값이 int이기 때문에, String으로 변환시켜 준다.
    	Cookie valueCookie = new Cookie("value", String.valueOf(value));
    	Cookie opCookie = new Cookie("op", op);
    -> 2. 저장한 쿠키를 다시 사용자에게 전달한다.
    		arg1.addCookie(valueCookie);
    		arg1.addCookie(opCookie);
    -> cookie[] 값 꺼내기
        - 저장된 값은 배열에 저장되어 있는데, 어느 index에 있는지 모르므로,
           "value"이름으로 값을 찾아야 한다.)
// cookie 배열에 String으로 저장되어 있으므로 다시 int로 바꿔줘야 한다.
 int x = 0;
			
 for(Cookie c : cookies) {
	if(c.getName().equals("value") ) { //name이 value와 같다면
		x = Integer.parseInt(c.getValue()); // 값을 꺼내기
		break;  // 값을 찾으면 반복문 나오기
	}
	}
  

 //Cookie 의 "op"이름으로 값 꺼내기
			String operator = "";
	
			for(Cookie c : cookies) {
				if(c.getName().equals("op")) {
					operator = c.getValue();
					break;  // 값을 찾으면 반복문 나오기
				}
			}


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="calc4" method="post">
		<div>
			<label>입력 : </label>
			<input type="text" name="value">
		</div>
		<div>
			<input type="submit" name="operator" value="+">
			<input type="submit" name="operator" value="-">
			<input type="submit" name="operator" value="=">
		</div>
	</form>
</body>
</html>

  • 숫자 입력 후 "+""-" 를 클릭하면 첫번 째 입력했던 숫자와
    클릭한 +, - 기호가 Cookie 에 저장되고, 두번 째 숫자를 입력하고
    "="을 클릭하면 연산 결과가 출력된다.


package com.koit.web.servlet;

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

import javax.servlet.ServletContext;
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;
import javax.servlet.http.HttpSession;

@WebServlet("/calc4")
public class MyServlet4 extends HttpServlet{
	
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
		
	
		// Cookie 객체 생성, Cookie는 배열로 반환 됨.
		Cookie[] cookies = arg0.getCookies();
		
		PrintWriter out = arg1.getWriter();
		
		String value_ = arg0.getParameter("value");
		String op = arg0.getParameter("operator");
		
		int value = 0;
		
		if(value_ != null && !value_.equals("")) {
			value = Integer.parseInt(value_);
		}
		
		if(op.equals("=")) {
			
			// 두번째 숫자와 '=' 이 value와 op에 저장됨.
			
			// 3. Cookie 꺼내기 (Cookie는 배열에 저장되어 있다.
            //어느 index에 있는지 모르므로, "value"이름으로 값을 찾아야 한다.)
			int x = 0;
			
			for(Cookie c : cookies) {
				if(c.getName().equals("value") ) {
					x = Integer.parseInt(c.getValue());
					break;  // 값을 찾으면 반복문 나오기
					}
			}
					
			int y = value;  // 두번재 넘어온 숫자
			
			//Cookie 의 "op"이름으로 값 꺼내기
			String operator = "";
	
			for(Cookie c : cookies) {
				if(c.getName().equals("op")) {
					operator = c.getValue();
					break;  // 값을 찾으면 반복문 나오기
				}
			}
			
			int result = 0;
			
			
			if(operator.equals("+")) {
				result = x + y;
			}else {
				result = x - y;
			}
			
			out.println("결과 : " + result);
		}else { // op가 +, - 인 경우 또 value와 op값을 받아야하는데,
        //요청은 단발성이기 때문에 요청이 다시 들어오면 기존 값은 사라진다.
				// 그렇기 때문에 기존 요청을 Cookie에 저장해놓고
                //다시 파라미터를 전달받아야 한다.
			
			// 1. cookie로 저장
			//cookie 객체 생성할 때, 생성자에 String, String만 가능하다.
			//value값이 int이기 때문에, String으로 변환시켜 준다.
			Cookie valueCookie = new Cookie("value", String.valueOf(value));
			Cookie opCookie = new Cookie("op", op);
			
			// 2. 저장한 쿠키를 다시 사용자에게 전달한다.
			arg1.addCookie(valueCookie);
			arg1.addCookie(opCookie);
			
			arg1.sendRedirect("calc4.html");
		}
	}

}

  • cookie 저장소 선언하기
    Cookie[] cookies = arg0.getCookies();
  • 사용자가 처음 입력한 숫자와 '+', '-' 를 파라미터로 받아 변수에 저장한다.
    ex) 5-

  • op변수가 '+', '-' 인 경우 두번째 숫자와 '='의 요청을 받아야하는데,
    그렇게 되면 첫 번째 받는 요청의 값이 사라지게 된다.
    ex) 3=

  • 그렇기 때문에 첫번째 요청값인 5-를 cookie 배열에 저장을 해야한다.

  • cookie에 값 저장하기
    "value"라는 이름의 value값을 저장하고, "op"라는 이름에 op값을 저장한다.
	Cookie valueCookie = new Cookie("value", String.valueOf(value));
	Cookie opCookie = new Cookie("op", op);
  • 사용자에게 cookie 전달하기
 arg1.addCookie(valueCookie);
 arg1.addCookie(opCookie);
  • 그 다음 두번째 요청 값인 숫자와 '='을 다시 변수에 받아오면
    처음 요청된 '+','-' 에 맞게 연산을 해야하기 때문에
    cookie 배열에서 값을 꺼내와야 한다.

  • cookie 배열 값 꺼내기 (저장할 때 썼던 이름값으로 담겨진 값을 가져온다)

	for(Cookie c : cookies) {
		if(c.getName().equals("value") ) {
			x = Integer.parseInt(c.getValue());
				break;  // 값을 찾으면 반복문 나오기
			}
			}




profile
웹 개발자 공부 중
post-custom-banner

0개의 댓글