匯出 (0) 列印
全部展開

如何使用工作階段親和性來維護工作階段資料

更新日期: 2015年3月

下列步驟示範如何建置應用程式,以使用工作階段親和性 (也稱為黏性工作階段) 和 javax.servlet.http.HttpSession 物件維護工作階段資料。

應用程式會顯示如下:

工作階段狀態範例

  1. 使用在下列任一主題建立的程式碼做為您的起點:

  2. 在 Eclipse 中建立 Azure 的 Hello World 應用程式所述,熟悉建置應用程式並將它部署至 Azure。

  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. 如果您使用在 Eclipse 中建立 Azure 的 Hello World 應用程式做為此範例的起點 (而不是在 JSP 中使用 Azure 服務執行階段程式庫),請對 index.jsp 進行下列變更。

    • 移除下列 import 陳述式:

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

    • 移除下列 html 陳述式:

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

    如果您稍後決定要使用 Azure 服務執行階段程式庫,請遵循在 JSP 中使用 Azure 服務執行階段程式庫中的指示。

  4. 建立名為 newsession.jsp 的檔案。

    1. 在 Eclipse 的 [專案總管] 檢視中,展開 [MyHelloWorld]。

    2. 開啟 [WebContent] 的內容功能表,按一下 [新增],然後按一下 [JSP 檔案]。

    3. 在 [新增 JSP 檔案] 對話方塊中,將檔案命名為 newsession.jsp,然後按 [下一步]。

    4. 在 [選取 JSP 範本] 對話方塊中,基於此教學課程的目的,請選取 [新增 JSP 檔案 (html)] 並按一下 [完成]。

    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 模擬器的資訊,請參閱在 Eclipse 中建立 Azure 的 Hello World 應用程式

  6. 部署就緒之後,在瀏覽器中啟動您的應用程式的 URL。您現在可以檢視工作階段資料。

若要進一步實驗,您可以嘗試一些動作,例如輸入使用者名稱的值、重新整理瀏覽器、瀏覽至另一個站台並返回您的應用程式、關閉瀏覽器並重新開啟它、按一下 [建立新的工作階段] 按鈕等。

對於已啟用工作階段親和性的角色,使用者的 HTTP 要求會繼續無限期地重新導向到相同的 Azure 角色執行個體,或直到使用者重新啟動瀏覽器為止 (即使您的應用程式在某個時間點讓此工作階段無效)。

如果您的應用程式具有刻意有工作階段狀態的一些程式碼,以及一些無工作階段狀態的程式碼,請考慮將應用程式分割成兩個部分 (兩個個別的 WAR 部署:一個是有工作階段狀態,一個是無工作階段狀態),並以兩個不同的 Azure 角色加以部署。有工作階段狀態角色存在於已啟用工作階段親和性的角色中,而無工作階段狀態角色則存在於已停用工作階段親和性的角色中。以此方式將有工作階段狀態與無工作階段狀態程式碼分割成不同的角色,將有助於確保您的 Azure 部署擁有最佳的延展性等級。

另請參閱

顯示:
© 2015 Microsoft