Questa pagina è stata utile?
I suggerimenti relativi al contenuto di questa pagina sono importanti. Comunicaceli.
Altri suggerimenti?
1500 caratteri rimanenti
Esporta (0) Stampa
Espandi tutto

Come mantenere i dati della sessione con l'affinità di sessione

Aggiornamento: marzo 2015

I passaggi seguenti mostrano come compilare un'applicazione che mantiene i dati della sessione usando l'affinità di sessione (definita anche sessioni permanenti) e l'oggetto javax.servlet.http.HttpSession.

L'applicazione sarà simile alla seguente:

Stato della sessione di esempio

  1. Usare il codice creato in uno degli argomenti seguenti come punto di partenza:

  2. Familiarità con la compilazione di un'applicazione e la distribuzione in Azure, come illustrato in Creazione di un'applicazione Hello World per Azure in Eclipse.

  1. Modificare le impostazioni del progetto di Azure per mantenere l'affinità di sessione, come illustrato in Affinità di sessione.

  2. Modificare index.jsp per usare il codice seguente:

    <%@ 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. Se è stato usato Creazione di un'applicazione Hello World per Azure in Eclipse come punto di partenza per questo esempio (invece di Uso della libreria di runtime del servizio Azure in JSP), apportare le modifiche seguenti a index.jsp.

    • Rimuovere l'istruzione import seguente:

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

    • Rimuovere l'istruzione html seguente:

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

    Se in un secondo momento si decide di usare la libreria di runtime del servizio di Azure, seguire le istruzioni disponibili in Uso della libreria di runtime del servizio Azure in JSP.

  4. Creare un file denominato newsession.jsp.

    1. Nella visualizzazione Project Explorer di Eclipse espandere MyHelloWorld.

    2. Aprire il menu di scelta rapida per WebContent, fare clic su New e quindi su JSP File.

    3. Nella finestra di dialogo New JSP File assegnare al file il nome newsession.jsp, quindi fare clic su Next.

    4. Nella finestra di dialogo Select JSP Template, ai fini di questa esercitazione, selezionare New JSP File (html) e fare clic su Finish.

    5. Usare i contenuti seguenti per 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. Sulla barra degli strumenti di Azure fare clic sull'icona Publish to Azure Cloud per distribuire l'applicazione in Azure. Per altre informazioni sulla distribuzione nell'emulatore di Azure, vedere Creazione di un'applicazione Hello World per Azure in Eclipse.

  6. Quando la distribuzione è pronta, nel browser avviare l'URL per l'applicazione. È ora possibile visualizzare i dati della sessione.

Per eseguire altri esperimenti, provare a effettuare azioni quali l'immissione di un valore per il nome utente, l'aggiornamento del browser, il passaggio a un altro sito e il ritorno all'applicazione, la chiusura e riapertura del browser, la selezione del pulsante Create new session e così via.

Per i ruoli per cui è abilitata l'affinità di sessione, le richieste HTTP dell'utente continueranno a essere reindirizzate alla stessa istanza del ruolo di Azure indefinitamente oppure fino al riavvio del browser da parte dell'utente, anche se la sessione viene a un certo punto invalidata dall'applicazione.

Se l'applicazione include codice che contiene intenzionalmente informazioni sullo stato della sessione e codice che non include tali informazioni, è consigliabile suddividere l'applicazione in due parti (due distribuzioni WAR distinte), ovvero una con informazioni sullo stato della sessione e una senza tali informazioni, e quindi distribuirle in due ruoli diversi di Azure. Il ruolo con informazioni sullo stato della sessione si troverà nel ruolo per cui è stata abilitata l'affinità di sessione e il ruolo privo di tali informazioni si troverà nel ruolo per cui l'affinità è disabilitata. La suddivisione del codice con e senza informazioni sullo stato della sessione in ruoli separati permetterà di assicurare un livello ottimale di scalabilità per la distribuzione di Azure.

Vedere anche

Mostra:
© 2015 Microsoft