Cookie にログインデータを保存してみる
iPad で Todoリストにログイン後、一度落としてから再度アクセスするとログイン画面から表示されてしまうので不便。ブラウザを閉じると SessionScopeを抜けてしまうのが原因らしい。
そこで Cookieを使ってブラウザ自体にログイン情報を覚えさせて、毎回ログイン画面が表示されないように改造してみる。
Cookie を保存する
- ログイン時の LogincheckController に以下の関数を追加し、run() で呼び出す。
- Cookie インスタンスを生成して生存期間を setMaxAge()で設定。単位は秒。無制限は無理っぽい。
- setPath()で Cookieが可視できるパスを設定する。まだよくわかっていない。
- 生成した Cookie インスタンスを response に addCookie() すればブラウザに保存される。
import javax.servlet.http.Cookie; protected void setUserToCookie(String user, String pass){ Cookie cookie = new Cookie("user",user); cookie.setMaxAge(60*10); cookie.setPath("/"); response.addCookie(cookie); Cookie cookie_pass = new Cookie("pass",pass); cookie_pass.setMaxAge(60*10); cookie_pass.setPath("/"); response.addCookie(cookie_pass); }
Cookie を読み出す
- リスト表示コントローラの IndexController に以下の関数を追加し、run()で呼び出す
- getCookies() で Cookieを取り出して、欲しいものが見つかるまでループで回す
- 必要な Cookieデータが揃ったら sessionScope に置いて sessionScope を見ている既存処理に流す。
protected void getUserCookiesAndSetToSessionScope(){ String cookie_user = null; String cookie_pass = null; Cookie cookies[] = request.getCookies(); if(cookies != null){ for(int i = 0;i<cookies.length;i++){ if(cookies[i].getName().equals("user")){ cookie_user = cookies[i].getValue(); }else if (cookies[i].getName().equals("pass")){ cookie_pass = cookies[i].getValue(); } if ( cookie_user != null && cookie_pass != null ){ sessionScope("login", "OK"); sessionScope("user", cookie_user); sessionScope("pass", cookie_pass); break; } } } }
上記実装後、iPad で試してみたら期待通りの動作となった。Cookie便利。しかも意外と簡単だった。でもパスワードとかも Cookie に入れちゃってセキュリティ的な問題は無いのだろうか。要調査。
参考URL
- http://www.techscore.com/tech/J2EE/Servlet/4.html
- http://mergedoc.sourceforge.jp/tomcat-servletapi-5-ja/javax/servlet/http/Cookie.html
- 今回はGAEでの実装だが、上記サイトのサーブレットでの実装と変わらないようだ。