セッション管理

### セッション
サーバ内に情報を保存し、異なるページ間で同一のクライアントを認識する仕組みのことです。

### セッション管理
##### 1.クライアントが初めてServletプログラムにアクセスした際、セッションIDが生成されます。

##### 2.生成されたセッションIDはクライアントに返され、保管されます。

##### 3.再びクライアントがServletプログラムにアクセスする際にセッションIDがクライアントから送信されます。

##### 4.Servletプログラムでは送信されたセッションIDにより、同一クライアントかどうかを判断します。
これらの一連の処理はcookieにより管理されます。cookieが使えない環境では、URLリンクでセッションIDを管理することもできます。

| 戻り型 | メソッド | 説明 |
|:-----------|------------:|:------------:|
| HttpSession | getSession( )| HttpServletRequestインタフェースで定義されているメソッドです。セッションオブジェクト（セッションID）を返します。セッションオブジェクトが生成されていない場合は、セッションオブジェクトを生成して返します。         |
|Object     | getAttribute(String)      |HttpSessionインタフェースで定義されているメソッドです。引数に指定されたデータ名に該当するセッションスコープのデータ値を返します。該当のデータ名がない場合にはnullを返します。
| void       | void	setAttribute(String, Object)        | HttpSessionインタフェースで定義されているメソッドです。第一引数にデータ名、第二引数にデータ値を指定し、セッションスコープを持つデータ値を登録します。すでにデータ名が存在する場合は、新しく指定されたデータ値が上書きされます。         |
| void         | invalidate( )          | 生成されているセッションオブジェクト（セッションID）を破棄します。           |
| boolean       | isNew( )       | クライアントがセッション管理されていないときにtrueを返します（初めてアクセスしたとき、クラインアントがcookieを使えないときなど）。クライアントがセッション管理されていないときにtrueを返します（初めてアクセスしたとき、クラインアントがcookieを使えないときなど）。       |

### セッションのタイムアウト
セッションIDは一定時間経過するか、クライアントのブラウザを閉じるか、もしくはinvalidateメソッドを呼び出すと削除されます。どの程度経過するとセッションIDが削除されるかはweb.xmlの<session-config>タグで指定できます。Tomcatのデフォルトの設定では30分になっています。また、HttpSessionインタフェースには、セッションごとに経過時間を設定できるsetMaxInactiveIntervalメソッド、getMaxInactiveIntervalメソッドが用意されています。

| 要素　      |　内容        | 
|:-----------|------------:|
|session-timeout | セッションのタイムアウト時間を分単位で指定します。0もしくは0以下の値を指定した場合は、セッションがタイムアウトしないことを表します。         |

#### 設定例
セッションのタイムアウトを180分に設定した例です。<session-config>タグは<servlet>タグ、<servlet-mapping>タグの後に記述する必要があります。

```xml
<session-config>
    <session-timeout>180</session-timeout>
</session-config>
```

### Javaにおける使用例
```java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        String id = "Java";

        /**
         * セッションオブジェクトが生成されていない場合、getSessionメソッドでセッションオブジェクトを生成します。
         * セッションオブジェクトがすでに生成されている場合は、既存のセッションオブジェクトを返します。
         **/
        HttpSession hs1 = req.getSession();
        PrintWriter out = res.getWriter();
        out.println("<HTML>");
        out.println("<BODY>");

        /**
         * クライアントがセッション管理されているかどうか（はじめてアクセスしたかどうか）で表示メッセージを変えます。
         * セッション管理されていない場合、データidをsetAttributeメソッドで保存し、"id + Nice to meet you."を表示します。
         * セッション管理されている場合は、データidの値をgetAttributeメソッドで取得し、"Hello! + id"を表示します。
         **/
        if (hs1.isNew()) {
            hs1.setAttribute("id", id);
            out.println(hs1.getAttribute("id") + " Nice to meet you.");
        } else {
            out.println("Hello! " + hs1.getAttribute("id"));
        }

        out.println("</BODY>");
        out.println("</HTML>");
    }
}
```

### cookieが使用できない場合のセッション管理
クライアントがcookieを使用できない場合、URLリンクにセッションIDを付与することによりセッション管理ができるようになります。ServletプログラムはURLリンクから、同一クライアントかどうかを判別します。セッションIDが付与されたURLリンクを作成するためには以下のメソッドを使用します。

| 戻り型 | メソッド | 説明 |
|:-----------|------------:|:------------:|
| String       | encodeURL(String)      | HttpServletResponseインタフェースで定義されているメソッドです。引数に指定されたURLにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。 |
|String|encodeRedirectURL(String)|HttpServletResponseインタフェースで定義されているメソッドです。sendRedirectメソッドで使用するためにセッションIDを付与したURLを生成します。cookieを使用できる環境などセッションIDを付与する必要がない場合は、URLは変化しません。|


### Javaにおける使用例
```java
String url = res.encodeURL("./SessionServlet");
out.println("<A HREF=\"" + url + "\">SessionServlet</A>");
```