티스토리 뷰
쿠키란?
- 클라이언트 단에 저장되는 작은 정보 단위
- 쿠키는 Key와 Value 이렇게 하나의 정보를 가지고 있다.
- 굉장히 단순한 문자열로 된 자료들을 저장한다.
- 이러한 쿠키는 클라이언트에서 생성하고 저장될 수 있고, 서버단에서 전송한 쿠키가 클라이언트에 저장 될 수도 있다.
- 쿠키는 브라우저별로 제한 값을 다르게 가져가고 있다. 참조 : http://browsercookielimits.squawky.net/
서버 → 클라이언트 이용방법
- 서버에서 클라이언트의 브라우저로 전송돼서 사용자의 컴퓨터에 저장된다.
- 이렇게 저장된 쿠키는 다시 해당하는 웹페이지를 접속할 때 브라우저에서 서버로 쿠키를 전송하게 된다.
- 이름-값 쌍 외에도 도메인(Domain), 경로(Path), 유효기간(Max-Age, Expires), 보안(Secure), HttpOnly 속성을 저장할 수 있다.
쿠키 객체 사용방법
서버에서 쿠키 생성
javax.servlet.http.Cookie
쿠키 생성 방식)
1
2 |
Cookie cookie = new Cookie(이름, 값);
response.addCookie(cookie); |
cs |
- 서버에서 쿠키 생성, Response의 addCookie메소드를 이용해 클라이언트에게 전송한다.
- 웹 클라이언트는 이 쿠키를 만들어준 서버한테 다시 요청을 보내게 될 때 자동으로 해당 쿠키들을 같이 보낸다.
- 서버는 요청으로부터 전달된 쿠키를 읽어 들여서 사용을 하게 된다.
클라이언트가 보낸 쿠키 정보 읽기
사용형식)
1 |
Cookie[] cookies = request.getCookies(); |
cs |
- 쿠키는 배열로 return이 된다. 즉 쿠키는 여러개일 수 있다.
- 쿠키 값이 없으면 null이 반환된다.
- 그렇기 때문에 최초의 쿠키값 null에 대한 처리를 해주어야 NullPointerException이 발생하지 않는다.
- Cookie가 가지고 있는 getName()과 getValue()메소드를 이용해서 원하는 쿠키정보를 찾아 사용한다.
클라이언트에게 쿠키 삭제 요청
사용형식)
1
2
3 |
Cookie cookie = new Cookie("이름", null);
cookie.setMaxAge(0);
response.addCookie(cookie); |
cs |
- 쿠키의 관리는 웹 클라이언트가 하기 때문에 삭제 할 수 있는 명령어는 없다.
- 쿠키를 삭제하는 명령은 없고, maxAge가 0인 같은 이름의 쿠키를 전송한다. 상태유지시간이 0인 쿠키가 생성된다.
- 같은 이름의 다른 값의 쿠키가 들어오면 클라이언트는 쿠키 자체를 교체한다.
- 유지시간이 0이기 때문에 교체된 해당 쿠키는 사라지게 된다.
쿠키의 유효기간 설정
메소드 setMaxAge()
- 인자는 유효기간을 나타내는 초단위의 정수형
- 만일 유효기간을 0으로 지정하면 쿠키의 삭제
- 음수를 지정하면 브라우저가 종료될 때 쿠키가 삭제
ex) 유효기간을 10분으로 지정하려면
-- cookie.setMaxAge(10 * 60); //초 단위 : 10분
- 1주일로 지정하려면 (7*24*60*60)
Spring MVC에서의 Cookie 사용
@CookieValue 애노테이션 사용
- 컨트롤러 메소드의 파라미터에서 CookieValue애노테이션을 사용함으로써 원하는 쿠키정보를 파라미터 변수에 담아 사용
컨트롤러메소드(@CookieValue(value="쿠키이름", required=false, defaultValue="기본값") String 변수명)
쿠키 이름
- 쿠키의 이름은 알파벳과 숫자로만 구성된다.
- 쿠키의 이름은 알파벳과 숫자로만 구성되고, 쿠키 값은 공백, 괄호, 등호, 콤마, 콜론, 세미콜론은 포함할 수 없다.
- 쿠키의 값을 한글로 저장하고 싶다면 인코딩해서 쿠키를 보내야하고, 받아온 쿠키는 다시 디코딩해서 봐야 한글의 값이 보인다.
쿠키를 이용한 상태정보 유지하기
*이전의 Guestbook 프로젝트에 이어서 진행
HttpServletRequest 이용
*GuestbookController.java
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 |
package kr.or.connect.guestbook.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.or.connect.guestbook.dto.Guestbook;
import kr.or.connect.guestbook.service.GuestbookService;
@Controller
public class GuestbookController {
@Autowired
GuestbookService guestbookService;
@GetMapping(path="/list")
public String list(@RequestParam(name="start", required=false, defaultValue="0") int start,
ModelMap model,
HttpServletRequest request,// HttpServletRequest 이용하여 쿠키 관련 작업을 한다.
HttpServletResponse response) {
String value = null;
boolean find = false;
//원하는 쿠기 찾기
Cookie[] cookies = request.getCookies(); // 클라이언트로부터 쿠키배열을 가져온다. 없다면 null을 리턴.
if(cookies != null) { //null에 대한 처리가 있어야 처음 들어왔을 때 NullPointException이 발생하지 않는다.
for(Cookie cookie : cookies) { // 각 쿠키들의
if("count".equals(cookie.getName())) { //이름이 count와 같은지 확인
find = true;
value = cookie.getValue();
break; // 찾으면 break;
}
}
}
if(!find) {
value = "1"; //쿠키는 문자열로된 값을 가질 수 있다.
}else { // 쿠키를 찾았다면.
try {
int i = Integer.parseInt(value);
value = Integer.toString(++i);
}catch(Exception ex) {
value = "1";
}
}
//쿠키 만들기
//쿠키는 변경된 값이 적용된 객체를 매번 새로 만들어서 보낸다.
Cookie cookie = new Cookie("count", value); // 위의 값들을 가지고 쿠키 생성, 쿠키도 키 : 값 형태.
cookie.setMaxAge(60 * 60 * 24 * 365); // 1년 동안 유지. if -1로 설정해놓으면 브라우저를 닫으면 쿠키도 사라진다.
cookie.setPath("/"); // '/' 경로 이하에 모두 쿠키 적용.
response.addCookie(cookie); // response. 새로 변경된 밸류를 가진 쿠키를 response에 담아 클라이언트로 보낸다.
// 클라이언트는 똑같은 이름의 쿠기가 들어왔을 때, 기존의 쿠키와 교체한다.
List<Guestbook> list = guestbookService.getGuestbooks(start);
int count = guestbookService.getCount();
int pageCount = count / GuestbookService.LIMIT;
if(count % GuestbookService.LIMIT > 0)
pageCount++;
List<Integer> pageStartList = new ArrayList<>();
for(int i = 0; i < pageCount; i++) {
pageStartList.add(i * GuestbookService.LIMIT);
}
model.addAttribute("list", list);
model.addAttribute("count", count);
model.addAttribute("pageStartList", pageStartList);
model.addAttribute("cookieCount", value); // jsp에게 전달하기 위해서 쿠키 값을 model에 담아 전송한다.
return "list";
}
@PostMapping(path="/write")
public String write(@ModelAttribute Guestbook guestbook,
HttpServletRequest request) {
String clientIp = request.getRemoteAddr();
System.out.println("clientIp : " + clientIp);
guestbookService.addGuestbook(guestbook, clientIp);
return "redirect:list";
}
} |
cs |
@CookieValue 이용
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
69
70
71
72
73
74
75 |
package kr.or.connect.guestbook.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.or.connect.guestbook.dto.Guestbook;
import kr.or.connect.guestbook.service.GuestbookService;
@Controller
public class GuestbookController {
@Autowired
GuestbookService guestbookService;
@GetMapping(path = "/list")
public String list(@RequestParam(name = "start", required = false, defaultValue = "0") int start, ModelMap model,
@CookieValue(value = "count", defaultValue = "0", required = true) String value, //// defaultValue : 쿠키가 없을
//// 때 최초로 지정할 값 설정
HttpServletResponse response) {
try {
int i = Integer.parseInt(value);
value = Integer.toString(++i);
} catch (Exception ex) {
value = "1";
}
// 쿠키 만들기
// 쿠키는 변경된 값이 적용된 객체를 매번 새로 만들어서 보낸다.
Cookie cookie = new Cookie("count", value); // 위의 값들을 가지고 쿠키 생성, 쿠키도 키 : 값 형태.
cookie.setMaxAge(60 * 60 * 24 * 365); // 1년 동안 유지. if -1로 설정해놓으면 브라우저를 닫으면 쿠키도 사라진다.
cookie.setPath("/"); // '/' 경로 이하에 모두 쿠키 적용.
response.addCookie(cookie); // response. 새로 변경된 밸류를 가진 쿠키를 response에 담아 클라이언트로 보낸다.
// 클라이언트는 똑같은 이름의 쿠기가 들어왔을 때, 기존의 쿠키와 교체한다.
List<Guestbook> list = guestbookService.getGuestbooks(start);
int count = guestbookService.getCount();
int pageCount = count / GuestbookService.LIMIT;
if (count % GuestbookService.LIMIT > 0)
pageCount++;
List<Integer> pageStartList = new ArrayList<>();
for (int i = 0; i < pageCount; i++) {
pageStartList.add(i * GuestbookService.LIMIT);
}
model.addAttribute("list", list);
model.addAttribute("count", count);
model.addAttribute("pageStartList", pageStartList);
model.addAttribute("cookieCount", value); // jsp에게 전달하기 위해서 쿠키 값을 model에 담아 전송한다.
return "list";
}
@PostMapping(path = "/write")
public String write(@ModelAttribute Guestbook guestbook, HttpServletRequest request) {
String clientIp = request.getRemoteAddr();
System.out.println("clientIp : " + clientIp);
guestbookService.addGuestbook(guestbook, clientIp);
return "redirect:list";
}
} |
cs |
참고 사이트 : http://www.edwith.org/
※
본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.
※
'웹 > 부스트코스' 카테고리의 다른 글
[WEB]상태정보 (0) | 2018.09.03 |
---|---|
[Spring]레이어드 아키텍처(Layered Architecture) 실습(방명록 만들기) (1) | 2018.08.05 |
[WEB] 레이어드 아키텍쳐(Layerd Architecture) (0) | 2018.08.04 |
[Spring]Spring MVC를 이용한 웹 페이지 작성 실습 (0) | 2018.08.03 |
[Spring]Spring MVC (0) | 2018.08.02 |
- Total
- Today
- Yesterday
- 자바
- 파이썬 클래스
- 파이썬 터틀
- 파이썬 진수 변환
- 파이썬 if문
- 자바 에센셜 실습문제
- 자바스크립트 자료구조
- 명품 c++ 실습
- 파이썬 for
- 버츄어박스
- 파이썬 연산자
- 파이썬 문자열
- 웹
- 파이썬
- 파이썬 단계적 개선
- 백준 10451
- css
- css 그리드
- 파이썬 객체
- 자바스크립트 그래프
- 파이썬 선택문
- 백준 11501
- 백준 1874
- 파이썬 함수
- 파이썬 while
- 백준
- 자료구조
- 파이썬 예제
- css 박스
- 파이썬 리스트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |