エクスポート (0) 印刷
すべて展開

セッション アフィニティを使用してセッション データを管理する方法

更新日: 2015年3月

次の手順は、セッション アフィニティ (スティッキー セッションとも呼ばれる) を使用してセッション データを管理するアプリケーションを構築する方法と、javax.servlet.http.HttpSession オブジェクトについて説明します。

アプリケーションの外観は次のようになります。

セッションの状態の例

  1. 次のトピックのいずれかで作成されたコードを開始点として使用します。

  2. アプリケーションの作成と Azure へのデプロイの知識。「Azure の Hello World アプリケーションを Eclipse で作成する」を参照してください。

  1. セッション アフィニティ の説明に従って、Azure プロジェクトの設定を変更してセッション アフィニティを管理します。

  2. 次のコードを使用するように index.jsp を変更します。

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1" 
        import="com.microsoft.windowsazure.serviceruntime.*"
        import="java.util.*"
        import="java.text.DateFormat"
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Session affinity example</title>
    <head/>
    <body>
    <p/>
    <%
    
    // Track the number of times this session has been visited.
    Integer visits = (Integer) session.getAttribute("visits");
    
    if (null == visits)
    {
        // Visits are not yet being maintained in session data.
        // Initialize this as the first visit. 
        visits = new Integer(1); 
    }
    else
    {
        // Visits are being maintained in session data.
        // Increment the visit tracker. 
        visits = new Integer(visits.intValue() + 1);  
    }
    
    // Update the session data to include the current count of visits.
    session.setAttribute("visits", visits); 
     
    // See if the user name is already part of the session data.
    String name;
    name = (String) session.getAttribute("username");
     
    if (null == name)
    {
        // The user name does not exist in the session data.
        // See if the user provided a name in the form.
        name = request.getParameter("username");
        if (null != name && "" != name)
        {
            // Store the username as session data. 
            session.setAttribute("username", name);
    
             // Welcome the new user.
         %>
        <p>Welcome <%= name %>!</p>
        <% 
        }
        else
        {
            // A name has not been entered by the user for this session.
            // Display a form and retrieve the user's namee.
            %>
           <form action="<%=request.getRequestURI() %>" method="post">
            Enter your name: <input type="text" name="username" /> (Press the <b>Enter</b> key when done)
            </form> 
            <%
        }
    }
    else
    { 
        // Welcome the returning user.
        %>
        <p>Welcome back <%= name %>!</p>
        <% 
    }
    
    // Display the session information.
    DateFormat dfDate = DateFormat.getDateInstance(DateFormat.FULL);
    DateFormat dfTime = DateFormat.getTimeInstance();
    
    long creationTime = session.getCreationTime();
    long lastAccessedTime = session.getLastAccessedTime();
    
    Date dateCreated = new Date(creationTime);
    Date dateLastAccessed = new Date(lastAccessedTime);
    
    %>
    <p/>
    <table border=1 width=90% >
    <tr><th>Session information</th><th>Value</th></tr>
    <tr><td>Session ID</td><td><%= session.getId() %></td></tr>
    <tr><td>New or existing</td><td><%= (session.isNew() ? "New" : "Existing") %></td></tr>
    <tr><td>Created</td><td><%= dfDate.format(dateCreated) %> <%= dfTime.format(dateCreated) %></td></tr>
    <tr><td>Last accessed</td><td><%= dfDate.format(dateLastAccessed) %> <%= dfTime.format(dateLastAccessed) %></td></tr>
    <tr><td>Maximum inactive interval</td><td><%= Integer.toString(session.getMaxInactiveInterval()) %> seconds</td></tr>
    <tr><td>Visits or refreshes by you to this session</td><td><%= visits.intValue() %></td></tr>
    <tr><td>Azure deployment ID</td><td><%= RoleEnvironment.getCurrentRoleInstance().getId() %></td></tr>
    <tr><th>Session attributes</th><th>Value</th></tr>
    <%
    
    // Determine the sessions attributes, by name.
    Enumeration<String> e = session.getAttributeNames();
    String attributeName;
    Object attributeValue;
    
    // Display any stored attributes.
    while (e.hasMoreElements())
    {
        attributeName = e.nextElement();
        attributeValue = session.getAttribute(attributeName);
        %>
        <tr><td><%= attributeName %></td><td><%= attributeValue.toString() %></td></tr> 
        <%
    }
    %>
    </table>
    
    <p/>
    <!-- Allow the user to create a new session. -->
    <form action="newsession.jsp" method="post">
        <input type="submit" name="newSession" value="Create new session" />
    </form> 
    </body>
    
    </html>
    
    
  3. この例の開始点として (JSP で Azure サービス ランタイム ライブラリを使用する ではなく) Azure の Hello World アプリケーションを Eclipse で作成する を使用した場合、index.jsp を次のように変更します。

    • 次の import ステートメントを削除します。

      import="com.microsoft.windowsazure.serviceruntime.*"

    • 次の html ステートメントを削除します。

      <tr><td>Azure deployment ID</td><td><%= RoleEnvironment.getCurrentRoleInstance().getId() %></td></tr>

    後で Azure Service Runtime ライブラリを使用する場合、JSP で Azure サービス ランタイム ライブラリを使用する の指示に従います。

  4. 「newsession.jsp」という名前のファイルを作成します。

    1. Eclipse の Project Explorer ビューで、[MyHelloWorld] を展開します。

    2. [WebContent] のコンテキスト メニューを開き、[新規]、[JSP ファイル] の順にクリックします。

    3. [新規 JSP ファイル] ダイアログ ボックスで、ファイルに [newsession.jsp] という名前を付け、[次へ] をクリックします。

    4. このチュートリアルでは、[Select JSP Template] ダイアログで [New JSP File (html)] を選択し、[Finish] をクリックします。

    5. newssession.jsp の次の内容を使用します。

      <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
          pageEncoding="ISO-8859-1"%>
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html>
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
      <title>New session page</title>
      </head>
      <body>
      <%
          // Invalidate the current session.
          session.invalidate();
      
          // Return the user to the initial page.
          String sslOffloadingProtocol = request.getHeader("X-FORWARDED-PROTO");
          if (sslOffloadingProtocol == null ||  !sslOffloadingProtocol.equalsIgnoreCase("https")) 
          {
              response.sendRedirect("index.jsp");
          }
          else
          {    
              // Handle scenarios where user terminated SSL at load balancer. This is applicable for the 
              // SSL Offloading feature or any other load balancer which sets the X-FORWARDED-PROTO header.
              StringBuffer completeRequestURL = new StringBuffer(sslOffloadingProtocol);
              completeRequestURL.append("://");
              completeRequestURL.append(request.getServerName());
              completeRequestURL.append("/stickysessions/index.jsp");
      
              response.sendRedirect(completeRequestURL.toString());
          }
      %>
      </body>
      </html>
      
  5. Azure のツール バーで [Azure クラウドに公開] アイコンをクリックして Azure にアプリケーションをデプロイします。Azure エミュレーターへのデプロイの詳細については、「Azure の Hello World アプリケーションを Eclipse で作成する」を参照してください。

  6. デプロイの準備ができたら、ブラウザー内でアプリケーションの URL を起動します。これで、セッション データを表示できるようになります。

ユーザー名に値を入力してブラウザーを更新する、他のサイトを参照してアプリケーションに戻る、ブラウザーを閉じて再度開く、[新しいセッションを作成] ボタンをクリックするなどの操作も試してみてください。

セッション アフィニティが有効になっているロールでは、ユーザーの HTTP 要求は同じ Azure ロール インスタンスに無期限にリダイレクトされ続けるか、またはユーザーがブラウザーを再起動するまでリダイレクトされ続けます。同じ時点でアプリケーションによりセッションが無効にされている場合でも同じです。

アプリケーションに計画的なセッション ステートフルであるコードと、セッション ステートレスである同じコードがある場合、アプリケーションを 2 つに分割することを検討してください (2 つの別々の WAR デプロイ)。1 つはセッション ステートフル、もう 1 つはセッション ステートレスのアプリケーションで、これらを 2 つの別々の Azure ロールにデプロイします。セッション ステートフルなロールはセッション アフィニティが有効になっているロール内に置かれ、セッション ステートレスなロールはセッション アフィニティが無効になっているロール内に置かれます。この方法でセッション ステートフルなコードとステートレスなコードを別々のロールに分けると、Azure デプロイの拡張性が確実に最適なレベルになります。

関連項目

表示:
© 2015 Microsoft