Cookie API
HttpSession
@SessionAttribute
Test용 Cookie & Session 객체 :
<%
//test용 Cookie 데이터 생성해서 client에게 전송
Cookie c = new Cookie("id", "cookieData");
c.setMaxAge(60*60);
response.addCookie(c);
//test용 Session 데이터 저장
session.setAttribute("id", "tester");
session.setAttribute("age", 100);
%>
Controller :
package controller;
import ...
@Controller
@RequestMapping("sessiontracking")
public class Step03Controller {
...
}
Cookie API
<a href="sessiontracking/cookietest">@CookieValue</a>
@RequestMapping("/cookietest")
public String m1(@CookieValue("id") String idValue) {
System.out.println("m1() -- " + idValue);
// 출력 결과 : "m1() -- " + cookieData"
}
🔵
(@CookieValue("id") String idValue)
- 쿠키에
"id"
라는 키 값에 저장된 데이터를String idValue
변수로 반환
HttpSession
<a href="sessiontracking/sessionTest1">HttpSession API 활용 </a>
@RequestMapping("/sessionTest1")
public String m2(HttpSession session) {
session.getAttribute("id"));
session.getAttribute("age"));
session.setAttribute("newData", "서버에서 새로 저장한 데이터");
return "redirect:/step03Session.jsp";
}
@RequestMapping("/sessionDelete")
public String m3(HttpSession session) {
System.out.println("m3()---");
session.invalidate();
session = null;
return "redirect:/step03Session.jsp";
}
🔵
(HttpSession session)
- Servlet 과 동일하게
HttpSession
객체로 Session 데이터 활용 가능🔵 Session 초기화
session.invalidate();
로 Session 초기화 후 null 값 반환
@SessionAttribute
✅ Spring Controller Session Tracking
@Controller
@RequestMapping("sessiontracking")
@SessionAttributes({"id", "age", "cust"})
public class Step03Controller {
...
}
🔵 클래스 상위에 선언
🔵
@SessionAttributes({})
- Session의 key 값들을 지정하는 배열
@RequestMapping("/sessionTest2")
public String m4(@ModelAttribute("id") String id,
@ModelAttribute("age") int age) {
return "redirect:/step03Session.jsp";
}
🔵
(@ModelAttribute("id") String id, @ModelAttribute("age") int age)
- session에 있는 id와 age key를 가진 데이터를 가져온다
🚩
@ModelAttribute
은 request에다 넣는건 줄 알았는데...!?
@SessionAttribute
에 지정된 key 값이 존재하지 않을 때는request.setAttribute("id", id)
와 비슷하게 실행되고forward
방식일 때만 jsp에서${requestScope.id}
으로 출력이 가능하다- 🤪❓
forward
방식이며@SessionAttribute
에 지정된 key 값이면${requestScope.id}
&${sessionScope.id}
둘 다 사용 가능 (왜 requestScope도 사용이 가능한지 잘 모르겠다😭)
@SessionStatus
✅ Session Data 초기화
@RequestMapping("/sessionDelete2")
public String m5(SessionStatus status) {
System.out.println("m5()--- ");
status.setComplete();
return "redirect:/step03Session.jsp";
}
🔵
SessionStatus
API
setComplete()
메소드를 사용해서 Session 초기화
✅ @PathParam
& DTO.class
@RequestMapping("sessionTest3DTO")
public String m6(Model model,
@PathParam("id") String id,
@PathParam("age") int age) {
model.addAttribute("id", id);
model.addAttribute("id", id);
return "redirect:/step03Session.jsp";
}
🔵
@PathParam
을 활용하요 각 데이터를 가져오거나 Query String과 일치되는 변수로 구성된 DTO 활용
다른 API의 활용으로 둘다 Session에 데이터를 추가는 가능하지만 초기화 하는 방식은 따로 작동
HttpSession
의 초기화 방식인 invalidate()
로는 @SessionAttributes
에서 지정된 key 값을 가진 Session Data는 삭제 불가
HttpSession
의 getAtrribute()
&setAttribute()
로 @SessionAttribute
에서 지정된 key의 데이터 반환 및 추가는 가능