Spring

  1. 쿠키와 세션

    • 쿠키와 세션의 공통 개념

      • 쿠키와 세션은 상태를 유지하는 '상태유지기술'들이다.
      • 쿠키의 경우 클라이언트단에 저장한다.
      • 세션의 경우 서버단에 저장한다.
      • 둘다 유효기간을 설정 가능.
      • 쿠키는 다른 사람들이 볼 수 있다는 단점.
      • 쿠키와 세션의 동작 원리



  • 쿠키의 제한 사항.
    • 브라우저별로 제한을 둠. 사이트별로 20개, 모든 사이트 합 300개. 이런 식.
    • 크기도 제한을 두고 있음.(4K byte)

  1. Spring에서의 쿠키 사용법

    • 문법(Syntax)

      (@CookieValue(Value="쿠키이름", required = false, defaultValue = "기본값")String 변수명)

       

    • 쿠키 생성하고 response에 담기

      • 쿠키는 (이름, 값)의 쌍 정보를 입력하여 생성.
      • 쿠키의 이름은 일반적으로 알파벳과 숫자, 언더바로 구성.
      Cookie cookie = new Cookie(이름, 값);
      response.addCookie(cookie);



    • 클라이언트가 보낸 쿠키 정보 읽기

      Cookie[] cookies = request.getCookies();



    • 쿠키의 유지시간 설정법 및 쿠키 삭제하는 법.

      Cookie cookie = new Cookie(이름, 값);
      cookie.setMaxAge(0); // 쿠키 삭제.
      or
      cookie.setMaxAge(10 * 60);
      //쿠키 유지시간 10분. (단위 : 초)
      response.addCookie(cookie); 



  2. Cookie의 사용

    • Cookie 어노테이션 없이 쿠키를 사용

      (...
      HttpServletRequest request,
      ...)
      //위와 같이 메소드의 인자를 추가.
      
          Cookie[] cookies = request.getCookies();
              String value = null;
              boolean find = false;
              if (cookies != null) {
                  for (Cookie cookie : cookies) {
                      if ("count".equals(cookie.getName())) {
                          find = true;
                          value = cookie.getValue();
                      }
                  }
              }
      //위의 경우 cookie가 없는 경우. 즉 처음 접속한 경우.
              if (!find) {
                  value = "1";
              } else { //else 문 안은 cookie가 있는 경우.
                  try {
                      int tempValue = Integer.parseInt(value);
                      value = Integer.toString(++tempValue);
                  } catch (Exception e) {
                      value = "1";
                  }
              }
              Cookie cookie = new Cookie("count", value);
              //위와 같이 "name", value(String) 형태로 쿠키를 만듦.
      



    • Cookie 어노테이션을 이용하여 쿠키 사용

      //이제 HttpServletRequest는 필요없음.
      @CookieValue(value = "count", required = true, defaultValue = "0") String value
      //메소드의 인자로 위를 추가.
      //쿠키값은 항상 String임
              try {
                  int tempValue = Integer.parseInt(value);
                  value = Integer.toString(++tempValue);
              } catch (Exception e) {
                  value = "1";
              }
      
              Cookie cookie = new Cookie("count", value);



    • cookie의 생명시간 설정 및 경로 설정

              cookie.setMaxAge(60 * 60 * 24 * 365);
              cookie.setPath("/");



    • cookie를 클라이언트에게 보내기

              response.addCookie(cookie);


      전체 코드 (이전 학습 내용이 섞여 있음) :

      @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*/
                  @CookieValue(value = "count", required = true, defaultValue = "0") String value
                  , HttpServletResponse response) {
      
              // start로 시작하는 방명록 구하기
              List<Guestbook> list = guestbookService.getGuestbooks(start);
      
              // 전체 페이지 수 구하기
              int count = guestbookService.getCount();
              int pageCount = count / GuestbookService.LIMIT;
              if (count % GuestbookService.LIMIT > 0)
                  pageCount++;
      
              // 페이지의 수만큼 start의 값을 리스트로 저장
              // 예를 들면 page의 수가 3이면
              // 0, 5, 10 이런 식으로 저장이 된다.
              // jsp에서는 list?start=0, list?start=5, list?start=10 과 같이 링크가 걸릴 것이다.
              List<Integer> pageStartList = new ArrayList<>();
              for (int i = 0; i < pageCount; i++)
                  pageStartList.add(i * GuestbookService.LIMIT);
      
              try {
                  int tempValue = Integer.parseInt(value);
                  value = Integer.toString(++tempValue);
              } catch (Exception e) {
                  value = "1";
              }
      
              Cookie cookie = new Cookie("count", value);
              cookie.setMaxAge(60 * 60 * 24 * 365);
              cookie.setPath("/");
              response.addCookie(cookie);
      
              model.addAttribute("list", list);
              model.addAttribute("count", count);
              model.addAttribute("pageStartList", pageStartList);
              model.addAttribute("cookieCount", value);
      
              // WEB-INF/views/list.jsp로 !
              return "list";
      
          }

       

세션

세션의 정의 : 클라이언트별로 서버에 저장하는 정보.

 

Session 사용 예제 (HttpSession 이용)

 

먼저 web.xml에 다음을 추가한다. 

 

<session-config>
    <session-timeout>30</session-timeout>
</session-config>
//30 = minute

Spring

@GetMapping(path="/studio")
public String studio(
		@RequestParam(name="login", required=false)String login,
		@SessionAttribute(name="intraId", required=false) String intraId,
		HttpSession session,
		HttpServletRequest request) {
	if (login != null) {
		session.setAttribute("intraId", login);
		request.setAttribute("login", login);
	} else if (intraId != null) {
		request.setAttribute("login", intraId);
	} else
		request.setAttribute("login", "로그인하기");
	return "studio";
}

 

-> HttpSession session을 통해 session사용이 가능.
-> setAttribute를 통해 세션에 정보를 등록.
-> RedirectAttributes.addFlashAttribute를 통해 redirect 시에도 attribute 정보를 유지.

 

 

* 세션 관련 메소드

 

long getCreationTime() 세션이 생성되고 얼마나 지났는지 
ms단위로 반환한다.
int getMaxInactiveInterval() 현재 생성된 세션을 유지하기 위해 설정된 최대 시간을 초 단위로 반환.
설정된 최대 시간이 없을 경우 기본값 30분.
String getId() 세션에 할당된 유일한 식별자(ID)를
String type으로 반환
void setAttribute(String name, Object value) value를 name에 담음.
Object getAttribute(String name) name을 통해 value를 얻어옴.
void removeAttribute(String name) name에 해당하는 attribute를 삭제.
void setMaxInactiveInterval 세션 유지 최대 시간을 설정.
boolean isNew() 세션이 새로 생겼는지 확인. 
세션이 새로 생겼으면 true, 
반대의 경우 false
void invalidate() 현재 생성된 세션 모두 삭제.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom