: 웹 서버 측에서 쿠키를 생성하여, 응답 데이터의 헤더에 저장해서 웹 브라우저에 전송
: 웹 브라우저는 쿠키 저장소에 text 형태로 쿠키를 저장
: 웹 브라우저는 요청이 있을 때 마다 저장한 쿠키를 웹 서버에 전송, 웹 서버는 그 쿠키를 사용해 필요한 작업 수행
※ 쿠키 생성 및 삭제 시 주의할 점
: 쿠키가 생성된 경로의 상위 경로에서는 쿠키가 삭제 불가!
: 쿠키가 생성된 경로 및 하위 경로의 쿠기만 삭제 가능!Ex) /ch09/cookie 에서 생성했다면, setPath(/ch09)나 setPath(/)된 쿠키는 삭제 불가
Ex) /ch09 에서 생성했다면, setPath(/)경로는 삭제 불가!!!!! setpath() 주의
Cookie cookies[] = request.getCookies();//모든 쿠키들을 가져와서 if(cookies!=null&&cookies.length>0){ for(int i=0; i<cookies.length; i++){ if("cookieName".equals(cookies[i]).getName){ Cookie cookie = cookies[i]; cookie.setMaxAge(0); cookie.setpath("/");//***생성해줄 때 setpath한 값과 동일해야!! res.addCookie(cookie); } } }
public class CookieMgr { private Map<String,Cookie> cookieMap = new HashMap(); //생성자 public CookieMgr(HttpServletRequest req) { Cookie cookies[] = req.getCookies(); if(cookies!=null&&cookies.length>0) { for(int i=0; i<cookies.length; i++) { Cookie cookie = cookies[i]; cookieMap.put(cookie.getName(), cookie); } } } //=============================================================== 쿠키 얻기 //해당 이름을 가진 쿠키가 있는가 public boolean exist(String name) { return cookieMap.get(name)!=null; } //이름으로 쿠키 얻기 public Cookie getCookie(String name) { return cookieMap.get(name); } //이름으로 쿠키값 얻기 public String getValue(String name) throws IOException{ return URLDecoder.decode(cookieMap.get(name).getValue(), "utf-8"); } //=============================================================== 쿠키 생성 //쿠키 수정, 쿠키 삭제도 생성으로 가능!! public static Cookie createCookie(String name, String val) { Cookie cookie = new Cookie(name,val); return cookie; } public static Cookie createCookie(String name, String val, String path) throws IOException{ Cookie cookie = new Cookie(name,URLEncoder.encode(val, "utf-8")); cookie.setPath(path); return cookie; } public static Cookie createCookie(String name, String val, String path, int maxAge) throws IOException{ Cookie cookie = new Cookie(name,URLEncoder.encode(val, "utf-8")); cookie.setPath(path); cookie.setMaxAge(maxAge); return cookie; } public static Cookie createCookie(String name, String val, String path, int maxAge, String domain) throws IOException{ Cookie cookie = new Cookie(name,URLEncoder.encode(val, "utf-8")); cookie.setPath(path); cookie.setMaxAge(maxAge); return cookie; } //=============================================================== 쿠키 제거 public boolean removeCookie(String name) { cookieMap.remove(name); return !exist(name); } }
① 디폴트 → <%@ page session="true"%>
session.setAttribute("name", "val");
② request.getSession() → <%@ page session="false"%>
//현재 요청과 관련된 session 객체를 리턴 HttpSession session = request.getSession(); //만약 session이 존재하지 않으면 새롭게 생성해서 리턴! //request.getSession(false)를 실행하면 존재하지 않을 경우, null을 리턴! session.setAttribute("name", "val");
Object object = session.getAttribute("name");
① 세션 종료
session.invalidate();
② 세션에서 값 제거
session.removeAttribute("name");
//최근에 session 객체에 접근한 시간 session.getLastAccessedTime()
① web.xml
<session-config> <session-timeout>50<session-timeout>//50분 </session-config>
② 메서드
session.setMaxInactiveInterval(60*60);//60분
※ 연관된 정보 저장을 위한 클래스 작성
: 연관된 정보를 클래스로 묶어서 저장하면 각 정보를 개별 속성으로 저장하지 않고 한개의 속성을 이용하여 저장 가능!
[문제점]
String memberId = session.getAttribute("memberId"); String name = session.getAttribute("name"); String email = session.getAttribute("email"); ... //만약 이메일 정보가 필요하지 않아 저장하지 않은 경우, NullPointException 발생 가능성!!
[해결방법]
//연관 정보를 저장할 클래스 별도로 관리 public class MemberInfo{ private String id; private String name; private String email; //getter, setter 메서드 } //============================================== //저장 <% MemberInfo memberInfo = new MemberInfo(); memberInfo.setId("memberId"); memberInfo.setName("name"); memberInfo.setEmail("email"); session.setAttribute("memberInfo",memberInfo); %> //꺼내오기 <% MemberInfo memberInfo = (MemberInfo)session.getAttribute("memberInfo"); %> ... <%= memberInfo.getId()%> //NullPointException 발생 막을 수 있음