「セッション管理」の編集履歴(バックアップ)一覧はこちら
「セッション管理」(2009/02/28 (土) 23:14:55) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*&bold(){セッションの開始}
"getSession"メソッドは、サーブレットを要求してきたクライアントに対してセッションが既に開始されていればそのセッションを返す。
引数に"ture"を指定した場合、セッションが開始されていなければ新規にセッションを開始した後でそのセッションを返す。
引数に"false"を指定した場合、セッションが存在しない場合にはnullを返す。
HttpSession session = request.getSession(true);
|URL|http://localhost:8080/session/sessiontest|
|アプリケーション配置場所|c:\servlet-sample\session\|
|web.xmlファイル|c:\servlet-sample\session\WEB-INF\web.xml|
|コンテキストファイル|C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\session.xml|
*&bold(){セッションを使ったデータの書き込みと読み込み}
"setAttribute"メソッドは、保存するデータを「名前」と「値」のペアで登録する。
HttpSession session = request.getSession(true);
session.setAttribute("visited", "1");
既に保存されているセッションオブジェクトを取り出して読み込むためには、「HttpSession」インターフェースで定義されている"getAttribute"メソッドを使う。
String visitedStr = (String)session.getAttribute("visited");
|URL|http://localhost:8080/session/sessiontest|
*&bold(){セッションオブジェクトの削除}
"removeAttribute"メソッドは、引数に指定した「名前」のセッションオブジェクト削除する。
HttpSession session = request.getSession(true);
session.removeAttribute("visited");
|URL(セッション開始)|http://localhost:8080/session/sessiontest|
| (オブジェクト削除)|http://localhost:8080/session/deleteobject|
*&bold(){セッションの破棄}
セッションを破棄するには「HttpSession」インターフェースで定義されている"invalidate"メソッドを使う。
HttpSession session = request.getSession(true);
session.invalidate();
|URL(セッション開始)|http://localhost:8080/session/sessiontest|
| (セッション破棄)|http://localhost:8080/session/invalidatesession|
*&bold(){セッション作成日時と最終アクセス日時}
セッションの作成日時を取得するには「HttpSession」インターフェースで定義されている"getCreationTime"メソッドを使う。
取得した値はlong型の値となっており、1/1/1970 GMT からの経過秒数で表される。
HttpSession session = request.getSession(true);
long createTime = session.getCreationTime();
Date createDate = new Date(createTime);
-最終アクセス日時の取得
「HttpSession」インターフェースで定義されている"getLastAccessedTime"メソッドを使う。
戻り値はlong型の値となっており、1/1/1970 GMT からの経過秒数で表される。
|URL|http://localhost:8080/session/sessiontest|
*&bold(){セッションの有効期限}
セッションの有効期限を取得するには「HttpSession」インターフェースで定義されている"getMaxInactiveInterval"メソッドを使う。
取得した値はint型の値となっており単位は秒数。
|URL|http://localhost:8080/session/sessiontest|
-<session-config>要素による有効期限の設定
全てのセッションのデフォルトの有効期限を設定するには、web.xmlにて<session-config>要素を使って指定する。
<web-app>
<session-config>
<session-timeout>
有効期限の分数
</session-timeout>
</session-config>
</web-app>
デフォルトのセッションの有効期限ではなく、個別のセッションに対する有効期限を設定するには「HttpSession」インターフェースで定義されている"setMaxInactiveInterval"メソッドを使う。
|URL|http://localhost:8080/session/sessiontest|
*&bold(){セッションIDの確認}
セッションIDを取得するには「HttpSession」インターフェースで定義されている"getId"メソッドを使う。
|URL|http://localhost:8080/session/sessiontest|
*&bold(){URL書き換え}
※URL書き換えはクッキーが使えないクライアントでもセッションを利用できるようになり便利だが、URL自体にセッションIDを記述してしまうとセッションIDがそのままログなどにも残ってしまいセキュリティ上問題がある。その為、この方法は推奨はされておらずあくまでクッキー利用を前提にしたほうが良い。
http://localhost:8080/session/sessiontest;jsessionid=(セッションID)
このようにセッションID付きのURLをクリックするなどしてサーバへリクエストを送ると、サーバ側ではそこからセッションIDを抜き出してクッキーがある場合と同じような処理をします。
このセッションID付きのURLの生成は、「HttpServletResponse」インターフェースで定義されている"encodeURL"メソッドを使うことで自動的に行うことができる。
このメソッドは引数にURLを表す文字列を指定して実行すると、セッションID付きのURLに変換して出力する。
HttpSession session = request.getSession(true);
out.println("<a href=\"/session/sessiontest\">再表示</a>");
↓
HttpSession session = request.getSession(true);
String eURL = response.encodeURL("/session/sessiontest");
out.println("<a href=\"" + eURL + "\">再表示</a>");
↓素材
1番目の引数に作成するクッキーのクッキー名を指定。
2番目の引数に保存したい情報を指定。
Cookie cookie = new Cookie("visited", "1");
*&bold(){クッキーをクライアントへ保存}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
:
Cookie cookie = new Cookie("visited", "1");
response.addCookie(cookie);
}
|URL|http://localhost:8080/cookie/cookietest|
|アプリケーション配置場所|c:\servlet-sample\cookie\|
|web.xmlファイル|c:\servlet-sample\cookie\WEB-INF\web.xml|
|コンテキストファイル|C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\cookie.xml|
-クッキーの確認方法
ブラウザのURL入力欄に「javascript:document.cookie;」を入力してEnter。
*&bold(){クッキーの取り出し}
"getCookies"メソッドを使用。
-特定のクッキーの検索
「Cookie」クラスで用意されている"getName"メソッドを使用。
-クッキーの値を取得
「Cookie」クラスで用意されている"getValue"メソッドを使用。
Cookie cookie[] = request.getCookies();
if (cookie != null){
for (int i = 0 ; i < cookie.length ; i++){
if (cookie[i].getName().equals("visited")){
String val = cookie[i].getValue();
}
}
}
|URL|http://localhost:8080/cookie/cookietest|
*&bold(){値の再設定}
「Cookie」クラスで用意されている"setValue"メソッドで既存のクッキーに別の値を設定する。
Cookie cookie[] = request.getCookies();
Cookie visitedCookie = null;
if (cookie != null){
for (int i = 0 ; i < cookie.length ; i++){
if (cookie[i].getName().equals("visited")){
visitedCookie = cookie[i];
}
}
if (visitedCookie != null){
int visited = Integer.parseInt(visitedCookie.getValue());
visitedCookie.setValue(Integer.toString(visited + 1));
response.addCookie(visitedCookie);
}
}
|URL|http://localhost:8080/cookie/cookietest|
*&bold(){有効期限の設定}
作成したクッキーはデフォルトで有効期限がブラウザが閉じるまでとなっている。
「Cookie」クラスで用意されている"setMaxAge"メソッドで有効期限を設定する。
有効期限は秒数で指定する。
例えば1時間に設定したい場合:
Cookie cookie = new Cookie("visited", "1");
cookie.setMaxAge(3600);
引数にマイナスの値を設定した場合、有効期限はブラウザが閉じるまでとなる。
引数に0を設定するとクッキーを破棄する。
|URL|http://localhost:8080/cookie/cookietest|
*&bold(){セッションの開始}
"getSession"メソッドは、サーブレットを要求してきたクライアントに対してセッションが既に開始されていればそのセッションを返す。
引数に"ture"を指定した場合、セッションが開始されていなければ新規にセッションを開始した後でそのセッションを返す。
引数に"false"を指定した場合、セッションが存在しない場合にはnullを返す。
HttpSession session = request.getSession(true);
|URL|http://localhost:8080/session/sessiontest|
|アプリケーション配置場所|c:\servlet-sample\session\|
|web.xmlファイル|c:\servlet-sample\session\WEB-INF\web.xml|
|コンテキストファイル|C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\session.xml|
*&bold(){セッションを使ったデータの書き込みと読み込み}
"setAttribute"メソッドは、保存するデータを「名前」と「値」のペアで登録する。
HttpSession session = request.getSession(true);
session.setAttribute("visited", "1");
既に保存されているセッションオブジェクトを取り出して読み込むためには、「HttpSession」インターフェースで定義されている"getAttribute"メソッドを使う。
String visitedStr = (String)session.getAttribute("visited");
|URL|http://localhost:8080/session/sessiontest|
*&bold(){セッションオブジェクトの削除}
"removeAttribute"メソッドは、引数に指定した「名前」のセッションオブジェクト削除する。
HttpSession session = request.getSession(true);
session.removeAttribute("visited");
|URL(セッション開始)|http://localhost:8080/session/sessiontest|
| (オブジェクト削除)|http://localhost:8080/session/deleteobject|
*&bold(){セッションの破棄}
セッションを破棄するには「HttpSession」インターフェースで定義されている"invalidate"メソッドを使う。
HttpSession session = request.getSession(true);
session.invalidate();
|URL(セッション開始)|http://localhost:8080/session/sessiontest|
| (セッション破棄)|http://localhost:8080/session/invalidatesession|
*&bold(){セッション作成日時と最終アクセス日時}
セッションの作成日時を取得するには「HttpSession」インターフェースで定義されている"getCreationTime"メソッドを使う。
取得した値はlong型の値となっており、1/1/1970 GMT からの経過秒数で表される。
HttpSession session = request.getSession(true);
long createTime = session.getCreationTime();
Date createDate = new Date(createTime);
-最終アクセス日時の取得
「HttpSession」インターフェースで定義されている"getLastAccessedTime"メソッドを使う。
戻り値はlong型の値となっており、1/1/1970 GMT からの経過秒数で表される。
|URL|http://localhost:8080/session/sessiontest|
*&bold(){セッションの有効期限}
セッションの有効期限を取得するには「HttpSession」インターフェースで定義されている"getMaxInactiveInterval"メソッドを使う。
取得した値はint型の値となっており単位は秒数。
|URL|http://localhost:8080/session/sessiontest|
-<session-config>要素による有効期限の設定
全てのセッションのデフォルトの有効期限を設定するには、web.xmlにて<session-config>要素を使って指定する。
<web-app>
<session-config>
<session-timeout>
有効期限の分数
</session-timeout>
</session-config>
</web-app>
デフォルトのセッションの有効期限ではなく、個別のセッションに対する有効期限を設定するには「HttpSession」インターフェースで定義されている"setMaxInactiveInterval"メソッドを使う。
|URL|http://localhost:8080/session/sessiontest|
*&bold(){セッションIDの確認}
セッションIDを取得するには「HttpSession」インターフェースで定義されている"getId"メソッドを使う。
|URL|http://localhost:8080/session/sessiontest|
*&bold(){URL書き換え}
※URL書き換えはクッキーが使えないクライアントでもセッションを利用できるようになり便利だが、URL自体にセッションIDを記述してしまうとセッションIDがそのままログなどにも残ってしまいセキュリティ上問題がある。その為、この方法は推奨はされておらずあくまでクッキー利用を前提にしたほうが良い。
http://localhost:8080/session/sessiontest;jsessionid=(セッションID)
このようにセッションID付きのURLをクリックするなどしてサーバへリクエストを送ると、サーバ側ではそこからセッションIDを抜き出してクッキーがある場合と同じような処理をします。
このセッションID付きのURLの生成は、「HttpServletResponse」インターフェースで定義されている"encodeURL"メソッドを使うことで自動的に行うことができる。
このメソッドは引数にURLを表す文字列を指定して実行すると、セッションID付きのURLに変換して出力する。
HttpSession session = request.getSession(true);
out.println("<a href=\"/session/sessiontest\">再表示</a>");
↓
HttpSession session = request.getSession(true);
String eURL = response.encodeURL("/session/sessiontest");
out.println("<a href=\"" + eURL + "\">再表示</a>");
*&bold(){クッキーかURL書き換えかの判別}
セッションを管理するためのセッションIDの取得についてクッキー経由かURL書き換えによるものか二通りの方式があるが、どちらの方式で利用されているかを判別することができる。判別することによってクッキー経由でのみサーブレットを利用させるなどの制限を行うことができる。
判別するには「HttpServletResponse」インターフェースで定義されている"isRequestedSessionIdFromCookie"メソッドと"isRequestedSessionIdFromUrl"メソッドを使う。
クッキー経由の場合には"isRequestedSessionIdFromCookie"がTRUEを、URL書き換え経由の場合には"isRequestedSessionIdFromURL"がTRUEを返す。
boolean cookie_flag = request.isRequestedSessionIdFromCookie();
boolean url_flag = request.isRequestedSessionIdFromURL();