セッションについて session-saka

Javaの話ではなく、httpネットワークにおけるセッションという概念についての話。

セッションとは、クライアントを識別するための記号のようなもの。httpのネットワークではサーバーはクライアントとの接続状態を把握しているわけではなく、(無数の)クライアントからのリクエストをただ受け取っているだけの状態。そのためクライアントごとにリクエストに個別の記号を付加して渡すことで自分からのリクエストですよと認識していただく。

手紙に自分の名前を書いて送るみたいなもんだと思うけど、それならIPアドレスでもいい。ひとりの人から要件の違う複数の手紙を同時に送る場合があるからIPアドレスではいけない。ということだと思う。

    • -

セッション番号はクライアントからの最初のリクエストがあった時にサーバー側で発行してクライアントはクッキーに保存する。
次回以降のリクエスト時はクライアントは自分のセッション番号を付加してリクエスト情報を送る。(セッション番号はテキストだそうです)

    • -

セッション番号はクッキーに保存するけれども、クッキーは使用しない設定にもできる(クライアント側で)ためその場合の判別方法などが用意されている。クッキーが使えない場合はURLにセッション番号が付加されるようにできる。

    • -

servletではセッション番号の発行はgetSessionメソッドで行う。
get書いてあるように、sessionというのは記号を自分で作るわけではなくjavaVMが作ってくれるわけでもなく、たぶんなにかしらネットワークの管理をしてくれているシステムが管理発行してくれるのだと思う。
→HttpSession session = request.getSession(true);
クライアントのリクエストに対して(つまりdoGetメソッドの中にということ)このコードを含めると、現在のクライアントとのセッションを開始する。ということになる。
(すでにセッションが開始されていたらそのセッションが返ってくる。)つまりJava上ではセッション開始を宣言するだけであとのセッション番号の発行とかは誰かがやってくれるんだと思う。

    • -

どうやらsessionに対して情報を保存できるらしい。
sessionに対して名前と値を保存することができる。(setAttributeメソッド)クッキーみたいに使うこともできる。

  • -

追記 02/25


sessionはクライアントを識別するユニーク番号で、サーバーからはクライアントのグローバルIPしか識別できないので、
複数のクライアントを利用しているところではsessionでしか個別に識別できない。
(サーバーからどの学校からのアクセスかは識別出来ても、その学校のどのPCかは判別出来ない)


セッション番号はクライアントに保持されるが他の情報(setAttributeメソッド)はクライアントには保持されないようだ。
クライアントに保持=Cookie保存したい場合はCookieオブジェクトを利用する。


sessionでクライアントがCookieを利用できるか分からない場合はURLに含めるようにするのが親切。
Ex.) String url = res.encodeURL("./nextPage.jsp");
リダイレクトで遷移する場合は
Ex.) String url = res.encodeRedirectURL("./nextPage.jsp");
どちらもCookieが優先され、Cookieが利用できない場合にURLにsession番号を自動付加してくれるので、
常に利用するくせをつければいいと思う。


sessionの有効時間はsetMaxInactiveIntervalメソッドを秒で指定する。
Ex.) session.setMaxInactiveInterval(60 * 10) // 10分


servletではセッション利用はHttpSessionオブジェクトを作成して利用するが、
jspではいきなりsession.setMaxInactiveInterval(60 * 10);とか出来てしまう…謎だ