Logo UGIdotNET

ASP.NET: intercettare l'utilizzo dei tasti BACK/FORWARD del browser

Com'è noto, i comandi BACK e FOWARD di un browser permettono di riportare a video le pagine visitate di recente.

Ebbene, capita spesso di sviluppare un'applicazione ASP.NET che funziona perfettamente... almeno finché l'utente fa click sui tasti suddetti, ed inizia ad interagire con una versione vecchia di una pagina; "vecchia" si intende nel senso che non corrisponde più allo stato raggiunto dall'applicazione sul server, ma risale ad uno o più postback precedenti.

Ovviamente l'applicazione ASP.NET non può impedire all'utente di agire sui tasti BACK e FORWARD del suo browser, ma può accorgersi se lo fa e se tenta di interagire con una versione vecchia di una pagina: in tal caso l'applicazione può intraprendere un'altra azione come misura di protezione, per esempio reindirizzare il browser alla pagina che corrisponde allo stato effettivo dell'applicazione, oppure restituire un messaggio che ammonisce l'utente di non sfruttare quella funzionalità del browser.

La soluzione consiste nel porre all'inizio del Page_Load() la chiamata al metodo preventBackForwardNavigation(). Tale metodo salva l'istante della richiesta sia in Session sia in ViewState (così viene memorizzato anche nella pagina); poi, in occasione dei successivi postback, verifica che l'istante restituito dal ViewState della pagina sia lo stesso recuperato da Session:

private void Page_Load(object sender, System.EventArgs e)
{
    preventBackForwardNavigation();
    // ...
}

private void preventBackForwardNavigation()
{
    if (Page.IsPostBack)
    {
        long i1 = (long)Session["LastRequestTime"];
        long i2 = (long)ViewState["LastRequestTime"];
        if (i1!=i2) Response.Redirect("Warning.aspx");
    }

    long now = DateTime.Now.Ticks;
    ViewState["LastRequestTime"] = now;
    Session["LastRequestTime"] = now;
}

Se i due istanti non coincidono, significa che il postback proviene da una versione vecchia della pagina, in quanto l'istante restituito dal ViewState è precedente a quello recuperato da Session, e quindi il browser viene reindirizzato ad una pagina di avviso Warning.aspx.

La soluzione presentata si applica nel caso di una singola pagina aspx, ma si può generalizzare alle applicazioni costituite da più pagine: è sufficiente salvare, oltre all'istante della richiesta di una pagina, anche il nome della pagina stessa.

Autore: Federico Zanin
Data: 29 settembre 2003
Ultimo aggiornamento: 23 luglio 2004
Categorie: 

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185