Israel Aéce

Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT

My Links

Blog Stats

Archives

Post Categories

Links

Login

Finalização de Variáveis de Sessão

Muitos interceptam o fechamento do navegador para finalizar alguma tarefa no servidor. A mais comum delas é "matar" a sessão do usuário, evitando que a mesma espere o timeout para ser removida da memória. Sendo assim, é necessário que voce invoque um método server-side para isso.

Uma alternativa é, no evento onUnload do JavaScript, abrir uma pop-up, apontando para uma página ASPX que, em seu evento Load, chame o método Abandon, remover individualmente cada uma delas ou fazer qualquer outro tipo de finalização. O problema desta técnica é com relação aos bloqueadores de pop-up que muitos navegadores possuem e, com essa funcionalidade habilitada, a abertura da janela de finalização não seria possível.

Sendo assim, podemos utilizar o Client Side Callbacks do ASP.NET 2.0 para isso. O código para isso, ficaria mais ou menos como:

public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsCallback && Request.Browser.SupportsCallback)
        {
            string funcaoJS = this.ClientScript.GetCallbackEventReference(
                this,
                "''",
                "''",
                "''",
                "''",
                true);

            body.Attributes.Add("onUnload", funcaoJS);
        }

        //Adicionando Informações a uma Dummy Session
        HttpContext.Current.Session["Dummy"] = "IsraelAece";
    }

    public string GetCallbackResult() { return ""; }

    public void RaiseCallbackEvent(string eventArgument)
    {
        HttpContext.Current.Session.Remove("Dummy");
    }
}

Isso fará com que um trecho de código JavaScript seja embutido no cliente e, quando o evento onUnload ocorrer, o método será disparado removendo/executando o código para remoção de informações pertinentes ao usuário corrente.

posted on Saturday, March 01, 2008 7:10 AM

Feedback

# re: Finalização de Variáveis de Sessão 3/3/2008 6:45 PM Wilson

Israel, bela dica!

Desculpe a minha ignorância, mas tenho duas pequenas dúvidas: Quem é o "body" deste exemplo? Que tipo de objeto ele é?

# re: Finalização de Variáveis de Sessão 3/3/2008 6:47 PM Israel Aece

Boas WIlson,

Body é o elemento body da página:

<body runat="server" id="body">
.....
</body>

# re: Finalização de Variáveis de Sessão 3/3/2008 7:01 PM Wilson

Que legal, eu desconhecia esta opção. Então quer dizer que podemos manipular o "body" no servidor também?

# re: Finalização de Variáveis de Sessão 3/3/2008 7:04 PM Israel Aece

Boas Wilson,

Sim, perfeitamente: http://www.projetando.net/Sections/ViewArticle.aspx?ArticleID=48

# re: Finalização de Variáveis de Sessão 3/3/2008 7:06 PM Wilson

Perfeito!

Obrigado pela outra dica...

# re: Finalização de Variáveis de Sessão 3/6/2008 7:23 PM Felipe

Israel, isto fará com que o evento Session_End no global.asax seja executado no servidor ???

# re: Finalização de Variáveis de Sessão 3/6/2008 8:26 PM Israel Aece

Boas Felipe,

Sim, é o que diz a documentação:

"Once the Abandon method is called, the current session is no longer valid and a new session can be started. Abandon causes the End event to be raised."

# re: Finalização de Variáveis de Sessão 3/20/2008 11:23 PM Rafael Cezar

Olá Israel,

Parabéns pela dica!

Estou só com um problema: Ao implementar o método no Unload do Body, caso o usuário clique em algum link para navegar para outra página, é executado o unload, expirando assim a sessão do usuário.

Como eu faço para implementar esse metódo, mas somente quando o usuário fechar o browser?

Existe uma solução?

Muito obrigado,

Rafael

# re: Finalização de Variáveis de Sessão 3/21/2008 12:23 AM Israel Aece

Boas Rafael,

Sim, para resolver isso, você pode dividir a sua página em 2 frames.

# re: Finalização de Variáveis de Sessão 4/9/2008 12:01 AM Ivan

Israel, tem como adaptar tal evento para serusando na masterpage?

# re: Finalização de Variáveis de Sessão 4/9/2008 12:46 AM Ivan

Ou melhor Israel, na master funciona, so que sempre que clico uma página que herda a master ele ja dispara o evento onunload, ou seja não precisa nem o usuario fechar o navegador, basta ele clicar em outro link que herde a master que ele ja dispara o evento e mata as sessões, tem como resolver tal problema?

# re: Finalização de Variáveis de Sessão 4/14/2008 6:06 AM Israel Aece

Boas Ivan,

O que pode fazer é recorrer a um IFRAME para isso.

# re: Finalização de Variáveis de Sessão 5/19/2008 10:48 PM Renato

Legal, gostei, mas ainda tenho o seguinte problema: Quando eu submeto o formulário e tem alguma coisa errada eu continuo na mesma página, mas quando eu submeto o formulário o onunload é executado.

Eu não quero que seja executado quando um postback é feito.

# re: Finalização de Variáveis de Sessão 5/19/2008 11:00 PM Renato

Valeu galera. Eu resolví fazendo o seguinte:

<script language="javascript">
var isPostBack = false;

function FinalizarSessao(){
if(!isPostBack())
window.open("['URL']");
else
isPostBack = false;
}
</script>

<form onsubmit="isPostBack=tru">

Funcionou, dahora, valeu pelas dicas aí, valeu mesmo.

Title  
Name  
Url
Box Code
Protected by FormShield
Comments