서블릿을 통한 상태유지 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.