HTTP プロトコルはステートレスであるため、Web アプリケーションは何らかの方法で、要求間でセッション情報を保持する必要があります。したがって、サーブレットが正しく機能するには、どのユーザが要求を送信しているか、そのユーザが Web アプリケーションとの対話を開始しているか、そのユーザが何を実行していたかをサーブレットが把握している必要があります。
単純な実装ではユーザ名が、セキュリティ保護されている実装ではユーザ名とパスワードが、電子商取引システムではショッピング カートがアプリケーションに記憶されます。サーブレット API を使用しないアプリケーションの場合、通常はアプリケーション固有の保存メカニズムを使用してセッション情報を保存し、非表示のフォーム フィールドまたはクッキーを通じてキー値をブラウザに返します。後続の要求では、このキー値を使用して前に保存されているセッション情報を取得します。
Java サーブレット仕様では HttpSession インターフェイスが定義されています。このインターフェイスによって、実装の詳細を把握せずにセッション管理を行うことができます。HttpSession インターフェイスは HttpServletRequest クラスから取得できます。
getSession メソッドによってセッションを確立し、getAttribute メソッドによってセッションからの値にアクセスします。
public class SelectionForm extends HttpServlet {
public void service(HttpServletRequest req,
HttpServletResponse resp)
throws IOException, ServletException {
resp.setContentType(“text/html”);
PrintWriter out = resp.getWriter();
String thisName = "Unknown Name";
// ログイン情報からユーザ名を取得します。
String[] attrArray = req.getParameterValues("myName");
// 呼び出しフォームには、myName の値が 1 つしかないと想定します。
if(attrArray != null && attrArray.length > 0) {
thisName = attrArray[0];
}
}
...
HttpServletRequest オブジェクトの getSession メソッドを呼び出すことによって新しいセッションを作成します。// セッションを作成します。 HttpSession thisSession = req.getSession();
// この例では、ユーザ名を保存します。
thisSession.setAttribute("name", thisName);
HttpServletRequest オブジェクトの getSession メソッドを呼び出すことによって session オブジェクトの参照を取得します。import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DisplayInfo extends HttpServlet {
public void service(HttpServletRequest req,
HttpServletResponse resp)
throws IOException, ServletException {
resp.setContentType(“text/html”);
PrintWriter out = resp.getWriter();
out.println("<html><head><title>Display Information");
out.println("</title></head><body>");
out.println("<h1>displayInfo Servlet</h1>");
// session オブジェクトからログイン ユーザを取得します。
HttpSession thisSession = req.getSession();
...
HttpSession オブジェクトの getAttribute メソッドを使用して希望する属性値にアクセスします。必ず結果を適切なタイプに変換してください。String userName = (String)thisSession.getAttribute("name");
if(userName != null) {
out.println("<h2>Welcome " + userName + "</h2>");
}