Экспорт (0) Печать
Развернуть все
Развернуть Свернуть

Сохранение данных сеанса с использованием сходства сеансов

Обновлено: Март 2015 г.

Ниже показано, как создать приложение, которое сохраняет данные сеанса, используя сходство сеанса (что также называется привязанными сеансами) и объект javax.servlet.http.HttpSession.

Приложение будет иметь следующий вид.

Пример состояние сеанса

  1. Используйте код, созданный в одном из следующих разделов, в качестве отправной точки:

    • Использование библиотеки среды выполнения служб Azure в JSP

      Это предпочтительная отправная точка, поскольку этот код использует библиотеку времени выполнения службы, что делает его более полезным из-за отображения идентификатора экземпляра роли Azure.

    • Создание приложения Hello World для Azure в Eclipse

      Идентификатор экземпляра роли Azure не отображается в приложении, если не использовать этот код в качестве отправной точки. В тексте для следующего примера кода указано, какие строки кода следует удалить для успешной компиляции.

  2. Необходимо ознакомиться с созданием и развертыванием приложения в Azure, как описано в разделе Создание приложения Hello World для Azure в 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. Если вы использовали Создание приложения Hello World для Azure в Eclipse в качестве отправной точки для этого примера (вместо Использование библиотеки среды выполнения служб Azure в JSP), внесите следующие изменения в index.jsp.

    • Удалите следующий оператор import:

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

    • Удалите следующий оператор html:

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

    Если впоследствии вы захотите использовать библиотеку среды выполнения служб Azure, следуйте инструкциям в разделе Использование библиотеки среды выполнения служб Azure в JSP.

  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 см. в разделе Создание приложения Hello World для Azure в Eclipse.

  6. После развертывания введите URL-адрес вашего приложения в браузере. Теперь можно просмотреть данные сеанса.

Чтобы продолжить эксперименты, можно попробовать ввести значение для имени пользователя, обновить браузер, перейти на другой сайт и вернуться в приложение, закрыть браузер и повторно открыть его, нажать кнопку Создать сеанс и т. д.

Для ролей с включенным сходством сеансов HTTP-запросы пользователя будет перенаправляться на тот же экземпляр роли Azure, пока пользователь не перезапустит браузер, даже если приложение сделает сеанс недействительным в определенный момент времени.

Если приложение содержит код, который намеренно отслеживает состояние сеанса, и код, который не сохраняет состояние сеанса, рассмотрите возможность разделения приложения на две части (два отдельных развертывания WAR): одну с отслеживанием состояния сеанса, а другую без сохранения состояния сеанса. Затем разверните их в двух ролях Azure. Роль с отслеживанием состояния сеанса располагается в роли с включенным сходством сеансов, а роль без сохранения состояния сеанса — в роли с отключенным сходством сеансов. Разделение кода с отслеживанием состояния и без сохранения состояния сеанса на отдельные роли поможет обеспечить оптимальный уровень масштабируемости для развертывания в Azure.

См. также

Показ:
© 2015 Microsoft