CookieとSession
JavaEE(Session)
★HttpSessionインターフェースについて
メソッド:
void setAttribute(String name,Object value)
Object getAttribute(String name)
void removeAttribute(String name)
String getId()
void invalidate()
Enumeration getAttributeNames()
boolean isNew()
void setMaxInactiveInterval(int i)
int getMaxInactiveInterval()
HttpSession session = req.getSession(true);
//値の取得
String value = (XXX)session.getAttribute("key");
//値の保存
session.setAttribule("key", XXX); // 保存するobjectはシリアライズ可能
//値の削除
session.removeAttribute("key");
session.setAttribute("count", 10); × プリミティブ型
session.setAttribute("count", new Integer(10)); 〇
Integer count = (Integer)session.getAttribute("count");
getSession(true) セッションが存在しない場合は新規に作る。開始の画面用
getSession(false) セッションが存在しない場合はnullを返す。途中の画面用
HttpSession session = request.getSession();
if ( session.isNew() ) {
String id = session.getId();
Date date1 = new Date(session.getCreationTime());
Date date2 = new Date(session.getLastAccessedTime());
String interval = session.getMaxInactiveInterval();
...
} else {
session.invalidate(); // 終了
}
HttpSessionのシリアライズ処理は時間がかかるため、必要なければ
1.<%@ page session="false"%>
2.HttpSessionのinvalidate()でセッションをすべて破棄
3.セッションに重いデータを設定しない
4.短いタイムアウト時間を設定(単位:秒) session.setMaxInactiveInterval(10 * 60);
★生成するHTML内のリンクにセッションIDを埋め込む場合
PrintWriter out = res.getWriter();
...
out.print(res.encodeURL("/sample.jsp"));
out.print(res.encodeRedirectURL("/sample.jsp"));
★セッション機能の実現方法
1・URL Rewriting <a href="go.html;sessionID=xxx">リンク</a>
2・cookie HTTPプロトコルのヘッダを利用 ※cookieを扱わない場合もある
3・hidden <input type="hidden" name="sessionID" value="xxx"> ※Submitした時のみ
ちなみに、クッキーが扱えるかどうかの判断 HttpServletRequestのisRequestedSessionIdFromCookie()
ですから、URL Rewritingとcookieの併用で初回は両方ともクライアントへ送る
★sessionのタイムアウトを設定する方法
1.session.setMaxInactiveInterval(900); // (単位:秒)
2.web.xml(単位:分)
<session-config>
<session-timeout>1</session-timeout>
</session-config>
3.tomcatのconf/web.xml(単位:分)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
※優先順位:1>2>3
JavaEE(Cookie)
一つのCookieの容量は4096バイト
一つのサーバがクライアントに発行できるCookie数は20個まで
public void saveCookie(String key, String value){
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(3600 * 24 * 7);
cookie.setMaxAge(0); // 消去という意味
response.addCookie(cookie);
}
public String getCookie(String key){
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if(cookie.getName().equals(key))
return cookie.getValue();
}
return "";
}