728x90
쿠키는 1개의 key 당 4kb의 데이터만 담을 수 있기 때문에 주의해서 사용해야 합니다. 이전 포스팅 하였던 세션관리와 비슷하기 때문에 해당 포스팅도 참고하세요.
[SpringBoot] Enum 으로 Session 관리하기
1. Key 정의
- CookieKeys Enum 클래스 생성
@RequiredArgsConstructor
public enum CookieKeys {
MY_COOKIE_VO("나의 쿠키 데이터", MyCookieVO.class);
public final String desc;
public final Class usageClass;
}
2. CookieManager 작성
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import java.util.Base64;
public class CookieManager {
public static HttpServletResponse getResponse() {
return HttpRequestUtil.getCurrentResponse();
}
public static void put(final SessionKeys sessionKeys, final Object object) throws Exception {
String jsonValue = ObjectUtil.objectToJsonString(object);
Cookie cookie = new Cookie(sessionKeys.name(), Base64.getEncoder().encodeToString(jsonValue.getBytes()));
cookie.setMaxAge(300); // 5분
getResponse().addCookie(cookie);
}
public static <T> T getAs(SessionKeys sessionKeys, final Class<T> clazz) throws Exception {
Cookie cookie = CookieUtil.getCookie(sessionKeys);
if (cookie != null) {
throw new MyBizException(ExceptType.COOKIE002); // 쿠키 값이 존재하지 않습니다.
}
String cookieValue = cookie.getValue();
byte[] decodedBytes = Base64.getDecoder().decode(cookieValue);
String decodedString = new String(decodedBytes);
T readClass = ObjectUtil.jsonStringToObject(decodedString, clazz);
if (!sessionKeys.usageClass.getClass().isInstance(readClass)) {
throw new MyBizException(ExceptType.SESS001); // 쿠키 타입이 일치하지 않습니다.
}
return readClass;
}
}
3. CookieUtil 작성
import jakarta.servlet.http.Cookie;
public class CookieUtil {
public static Cookie[] getAllCookies() {
return HttpRequestUtil.getCurrentRequest().getCookies();
}
public static Cookie getCookie(CookieKeys cookieKeys) {
Cookie[] cookies = getAllCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieKeys.name())) {
return cookie;
}
}
}
return null;
}
}
4. HttpRequestUtil 작성
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class HttpRequestUtil {
/**
* 현재 request 가져오기
*/
public static HttpServletRequest getCurrentRequest() {
try {
return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
} catch (Exception e) {
return null;
}
}
/**
* 현재 response 가져오기
*/
public static HttpServletResponse getCurrentResponse() {
try {
return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getResponse();
} catch (Exception e) {
return null;
}
}
}
5. 사용
// set
CookieManager.put(CookieKeys.MY_COOKIE_VO, myCookieVO);
// get
MyCookieVO myCookieVO = CookieManager.getAs(CookieKeys.MY_COOKIE_VO, MyCookieVO.class);
감사합니다.
728x90
'프레임워크 > SpringBoot' 카테고리의 다른 글
[SpringBoot] Window10 Nexus Repository 구성하기 (0) | 2024.06.12 |
---|---|
[SpringBoot] Tomcat 으로 war 파일 배포하기 (0) | 2024.06.12 |
[SpringBoot] ErrorController 작성하기(With Thymeleaf) (0) | 2024.05.28 |
[SpringBoot] Mybatis 다중 Datasource 적용하기 (0) | 2024.05.27 |
[SpringBoot] Test 코드 작성하기(MockMvc) (0) | 2024.05.27 |