¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Mantenimiento de los datos de sesión con Afinidad de sesión

Mantenimiento de los datos de sesión con Afinidad de sesión

Actualizado: marzo de 2015

Los pasos siguientes muestran cómo crear una aplicación que mantiene los datos de la sesión mediante el uso de afinidad de la sesión (también denominadas sesiones permanentes) y el objeto javax.servlet.http.HttpSession.

La aplicación tendrá un aspecto similar al siguiente:

Ejemplo de estado de sesión

  1. Utilice el código creado en cualquiera de los temas siguientes como punto de partida:

  2. Familiaridad con la creación de una aplicación y su implementación en Azure, como se describe en Creación de una aplicación Hola a todos para Azure en Eclipse.

  1. Modifique la configuración del proyecto de Azure para mantener la afinidad de la sesión, como se describe en Afinidad de la sesión.

  2. Modifique index.jsp para utilizar el código siguiente:

    <%@ 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. Si usó Creación de una aplicación Hola a todos para Azure en Eclipse como punto de partida para este ejemplo (en lugar de Uso de la biblioteca en tiempo de ejecución del servicio de Azure en JSP), realice los cambios siguientes en index.jsp.

    • Quite la siguiente instrucción import:

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

    • Quite la siguiente instrucción html:

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

    Si más adelante decide que desea utilizar la biblioteca en tiempo de ejecución del servicio de Azure, siga las instrucciones de Uso de la biblioteca en tiempo de ejecución del servicio de Azure en JSP.

  4. Cree un archivo denominado newsession.jsp.

    1. En la vista del Explorador de proyectos de Eclipse, expanda MyHelloWorld.

    2. Abra el menú contextual de WebContent, haga clic en New (Nuevo) y, a continuación, haga clic en JSP File (Archivo JSP).

    3. En el cuadro de diálogo New JSP File (Nuevo archivo JSP), ponga al archivo el nombre newsession.jsp y haga clic en Next (Siguiente).

    4. En el diálogo Select JSP Template, para los fines de este tutorial, seleccione New JSP File (html) y haga clic en Finish.

    5. Utilice el siguiente contenido para 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. En la barra de herramientas de Azure, haga clic en el icono Publish to Azure Cloud (Publicar en la nube de Azure) para implementar su aplicación en Azure. Para obtener información adicional acerca de la implementación en el emulador de Azure, consulte Creación de una aplicación Hola a todos para Azure en Eclipse.

  6. Cuando la implementación esté lista, en el explorador, vaya a la dirección URL de la aplicación. Ahora puede ver los datos de la sesión.

Si desea realizar más pruebas, puede realizar acciones como escribir un valor para el nombre de usuario, actualizar el explorador, ir a otro sitio y volver a la aplicación, cerrar el explorador y abrirlo de nuevo, hacer clic en el botón Create new session (Crear nueva sesión), etc.

Para los roles con la afinidad de la sesión habilitada, las solicitudes HTTP del usuario seguirán siendo redirigidas a la misma instancia de rol de Azure indefinidamente o hasta que el usuario reinicie el explorador, incluso si se invalida la sesión por parte de la aplicación en algún momento.

Si la aplicación tiene código que está deliberadamente con estado de sesión y algún código que no tiene estado de sesión, considere la posibilidad de dividir su aplicación en dos partes (dos WAR implementaciones independientes), una con estado de sesión y otra sin estado de sesión, e implementarlas en dos roles distintos de Azure. El rol con estado de sesión residiría en el rol con la afinidad de la sesión habilitada, y el rol sin estado de sesión residiría en el rol con la afinidad de la sesión deshabilitada. La división del código con estado y sin estado de la sesión en roles independientes de este modo garantizará un nivel óptimo de escalabilidad para la implementación de Azure.

Vea también

Mostrar:
© 2015 Microsoft