사용자쪽에 저장된다.(세션 : 서버쪽에 저장)
사용자가 직접 접속한 사이트에 종속된 공간
팝업 1주일간~~보지않기, 이런거 처리용도
장바구니 - 현재까지 장바구니에 담은 아이템 저장 용도
(로그인하지 않고 장바구니에 담은 경우 장바구니에 담은 아이템 쿠키에 저장해놓는다.)
스프링 어노테이션으로 쿠키를 가져오는 경우 특수문자, 한글은 표현이 제대로 되지 않는 경우가 있어서 사용을 자제해야 한다.
사용자가 개발자 도구를 열어서 쿠키를 확인할 경우 어떤 값인지 알지 못하도록 하는 것이 좋다.
@Controller
public class CookieController {
@RequestMapping("/newCookie")
public String newCookie(HttpServletResponse response) {
//쿠키는 response에 담아서 보내야 한다.
//넘기기 전 url encoding 과정을 거쳐야 한다.
try {
String ck1_str = URLEncoder.encode("넘긴 쿠키", "UTF-8");
String ck2_str = URLEncoder.encode("서버에서userid쿠키", "UTF-8");
Cookie ck1 = new Cookie("ck1", ck1_str);
Cookie ck2 = new Cookie("userId", ck2_str);
//쿠키의 유효시간 설정하기(s)
ck1.setMaxAge(60 * 20); //20m
ck2.setMaxAge(60 * 60 * 24); //1h * 24 = 1d
response.addCookie(ck1);
response.addCookie(ck2);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "newCookie";
}
@RequestMapping("/readCookie")
public String readCookie(HttpServletRequest request) {
String value = CookieUtils.findCookie(request, "userId");
Cookie[] cookies = request.getCookies();
String value2 = CookieUtils.findCookie(cookies, "userId"); // 이 기능을 추가로 제공하는 형태로 변경
String value3 = CookieUtils.findCookie(request, "ck1");
String value4 = CookieUtils.findCookie(cookies, "JSESSIONID");
if(value == null) {
System.out.println("해당 쿠키가 없는 경우 로직");
}
System.out.println("request로 찾은 userid 쿠키 값 : " + value);
System.out.println("cookie[]로 찾은 userid 쿠키 값 : " + value2);
System.out.println("request로 찾은 ck1 값 : " + value3);
System.out.println("cookie[]로 찾은 JSESSION 값 : " + value4);
return "readCookie";
}
//쿠키를 가져올 수 있는 스프링 어노테이션
@RequestMapping("/readCookieValue")
public String readCookieValue(@CookieValue("userId") String userId,
@CookieValue(name = "ck1", defaultValue = "") String ckStr) {
System.out.println(userId);
System.out.println(ckStr);
return "readCookie";
}
}
public class CookieUtils {
// 리팩토링 케이스 1.
public static String findCookie(HttpServletRequest request, String cookieName) {
Cookie[] cookies = request.getCookies();
return findCookie(cookies, cookieName);
}
public static String findCookie(Cookie[] cookies, String cookieName) {
try {
for (Cookie ck : cookies) {
if (ck.getName().equals(cookieName)) {
String ck_value = URLDecoder.decode(ck.getValue(), "UTF-8");
return ck_value;
}
}
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
// 리팩토링 케이스 2.
/*
* public static String findCookie(HttpServletRequest request, String
* cookieName) {
*
* Cookie[] cookies = request.getCookies(); return findCookieValue(cookies,
* cookieName); }
*
* public static String findCookie(Cookie[] cookies, String cookieName) { return
* findCookieValue(cookies, cookieName); }
*
* //getCookieName public static String findCookieValue(Cookie[] cookies, String
* cookieName) {
*
* try { for (Cookie ck : cookies) { if(ck.getName().equals(cookieName)) {
* String ck_value = URLDecoder.decode(ck.getValue(), "UTF-8"); return ck_value;
* } } } catch (Exception e) { // TODO: handle exception }
*
* return null; }
*/
}
http://propedit.sourceforge.jp/eclipse/updates
저장은 변환된 코드로 저장하되 우리가 보는 properties 파일에서는 한글로 볼 수 있게 해준다.
이클립스 -> Help -> Install New Software -> Add
(ppedit이란 이름으로 install 실행)
webapp/WEB-INF/spring/appServlet/servlet-context.xml 아래에 다음의 코드를 추가한다.
<!-- Properties Message 처리 관련 설정 -->
<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
<beans:property name="basename" value="/WEB-INF/properties/property01"></beans:property>
</beans:bean>
<beans:bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor">
<beans:constructor-arg ref="messageSource"></beans:constructor-arg>
</beans:bean>
프로젝트 WEB-INF/properties 폴더 생성
property01.properties 파일 생성
모든 페이지에서 사용되는 경우 프로퍼티에 등록해서 사용한다.
ex)일반적인 안내 메시지 등을 등록해놓고 가져다가 사용한다.
Bean객체를 자동으로 맵핑시켜주는 어노테이션
@Autowired
ReloadableResourceBundleMessageSource messageSource;
com.main.title=사이트제목
com.main.var1=englishVar
com.main.cnt1=450
com.main.welcome=안녕하세요! 어서오세요!
com.main.userWelcome={0}님 반갑습니다~! {1} 사이트입니다.
Object[] args = {"고객", "아주 좋은"};
Object[] args2 = {"손", "그저 그런"};
String m4 = messageSource.getMessage("com.main.userWelcome", args, null);
String m5 = messageSource.getMessage("com.main.userWelcome", args2, null);
//model.addAttribute("m4", m4); //얘를 넣어주면 안된다.
model.addAttribute("args", args);
model.addAttribute("args2", args2);
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<p><spring:message code="com.main.title"/></p>
<p><spring:message code="com.main.var1"/></p>
<p><spring:message code="com.main.cnt1"/></p>
<p><spring:message code="com.main.welcome"/></p>
<!-- 화면에서는 브라우저의 언어 설정에 따라 달리 출력된다. -->
<p><spring:message code="com.main.userWelcome" arguments="${args}"/></p>
<p><spring:message code="com.main.userWelcome" arguments="${args2}"/></p>
//Locale locale을 넣어 준다.
public String msgPage(Model model, Locale locale) {
//Locale, 지역정보를 출력
System.out.println(locale);
String msg_ko = messageSource.getMessage("com.main.welcome", null, locale);
String msg_en = messageSource.getMessage("com.main.welcome", null, locale.ENGLISH);; //강제로 지정하는 방법
System.out.println(msg_ko);
System.out.println(msg_en);
@Controller
@PropertySource("WEB-INF/properties/property01.properties")
@PropertySource("WEB-INF/properties/db.properties")
@PropertySource( value = {
("WEB-INF/properties/property01.properties"),
("WEB-INF/properties/db.properties")
})
public class MainController {
@Value("${com.main.title}")
String mainTitle;
@Value("${com.main.var1}")
String engVar;
@Value("${com.main.cnt1}")
int cnt1;
@Value("${db.userId}")
String dbUserId;
@RequestMapping("/main")
public String main(Model model) {
//jsp페이지에서 아래와 같이 모델에 담아 사용하지 않으려면 따로 설정이 필요하다.
model.addAttribute("mainTitle", mainTitle);
model.addAttribute("engVar", engVar);
model.addAttribute("cnt1", cnt1);
System.out.println(mainTitle);
System.out.println(engVar);
System.out.println(cnt1);
System.out.println(dbUserId);
return "main";
}
}
<!-- view 페이지에서 출력하는 부분 -->
${mainTitle}<hr/>
${engVar}<hr/>
${cnt1}<hr/>