Post

서블릿을 통한 상태유지 3가지 방법

서블릿을 통한 상태유지 3가지 방법.

1. applicationContext

상태 저장공간에 담는다.

WAS 서버의 메모리에 있다.

1
2
3
4
5
6
7
8
9
10
11
//선언은 이렇게 한다. req는 HttpServletRequest 객체
ServletContext context = req.getServletContext();

//getAttribute는 컨텍스트에 저장된 값을 꺼낸다.
int getv = (Integer)context.getAttribute("v");
String getop = (String) context.getAttribute("operator");

//setAttribute는 컨텍스트에 값을 저장한다. 키 , 밸류
context.setAttribute("operator",op);
context.setAttribute("v",v);

2. Session에 담기

세션에 값을 저장한다.

브라우저마자 세션값이 다르고, 코드를 통해서 직접 세션 만료시간을 설정해줄 수 있다.

Was에 세션값들을 저장.

처음에 접근했을 때에는 세션값을 부여받지 않은 상태로 접근하고 두 번째 부터는 부여받은 세션값으로 접근한다.

세션값으로 접근하면 서버는 요청을 받아줄 수 밖에 없다. 때문에 세션하이재킹(Session hijacking)이 떠올랐다.

사용방식은 Context와 굉장히 유사하다.

1
2
3
4
5
6
7
8
9
10
//선언
HttpSession session = req.getSession();

//값 꺼내기.
int getv = (Integer)session.getAttribute("v");
String getop = (String) session.getAttribute("operator");

//값 넣기
session.setAttribute("operator",op);
session.setAttribute("v",v);

3. Cookie에 저장하기

쿠키에 값을 담는 방법이 있다.

클라이언트가 쿠키를 가지고 있어서 서버에서 그 클라이언트에 저장된 쿠키값들을 받아 연산을 처리한다는 것이다.

일반 변수는 각각 찾아주고, 각각 뿌려주는 불편한 점이 있다.

추후 Json을 보내는 방식을 알게되면 불편함이 덜 할 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package example;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

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

@WebServlet("/cookietest")
public class CookieTest extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{
        res.setCharacterEncoding("UTF-8");
        res.setContentType("text/html; charset=UTF-8");

        Integer result = 0;

        //Cookie를 가져온다.
        Cookie[] cookies = req.getCookies();

        PrintWriter out = res.getWriter();

        String value = req.getParameter("v");
        String op = req.getParameter("operator");
        int v = 0;
        if(!value.equals("")){
            v = Integer.parseInt(value);
        }
        if(op.equals("=")){
            int getv = 0;
            String getop = "";

            //Cookie에서 값을 꺼낸다.
            if(cookies.length>0){
                for(Cookie cookie : cookies){
                    System.out.println(cookie.getName());
                    if(cookie.getName().equals("v")){
                        //문자열이므로 정수로 치환
                        getv = Integer.parseInt(cookie.getValue());
                    }
                    //opertor도 꺼내줌.
                    if(cookie.getName().equals("operator")){
                        getop = cookie.getValue();
                    }
                }
            }

            if(getop.equals("+")){
                result = v + getv;
            }
            else{
                result =v - getv;
            }
            out.println("계산결과는 : " + result);
        }

        //쿠키를 추가한다. 문자열의 형태만 가능하다.!!
        Cookie valuecookie = new Cookie("v",String.valueOf(v));
        Cookie opcookie = new Cookie("operator",op);

        res.addCookie(valuecookie);
        res.addCookie(opcookie);

    }
}

추가로 setcookie() 메소드를 통해 url을 지정해줄 수 있다.

직접 사용해보니 엄청 불편하다. 변수가 늘어날 때마다 하나하나 넣어줘야하고, 하나하나 찾아주는 과정이 복잡할 것이다. 추후 JSON방식으로 보내는 법을 알게되면 나을듯.

보통 쿠키의 생조주기는 정해주지 않으면 브라우저의 생존주기와 같다.

웹 브라우저의 메모리 또는 파일에 저장된다.

This post is licensed under CC BY 4.0 by the author.