Qual é a diferença entre destruir uma sessão e remover seus valores? Você pode fornecer um exemplo que demonstre isso?
Eu procurei essa pergunta, mas não entendi a resposta total. Algumas respostas são:
Session.Abandon()
destrói a sessãoSession.Clear()
apenas remove todos os valores
Um amigo me disse isso:
Limpar a sessão não cancelará a definição da sessão, ela ainda existe com o mesmo ID para o usuário, mas com os valores simplesmente limpos.
O abandono destruirá a sessão completamente, o que significa que você precisa iniciar uma nova sessão antes de armazenar mais valores na sessão para aquele usuário.
O código abaixo funciona e não lança nenhuma exceção.
Session.Abandon();
Session["tempKey1"] = "tempValue1";
Quando você Abandon () uma Session, você (ou melhor, o usuário) obterá um novo SessionId
Quando eu testo a sessão, não faz nenhuma alteração quando eu abandono a sessão.
Acabei de encontrar uma diferença:
session.Abandon()
aumenta o Session_End
evento
fonte
Respostas:
Limpar - remove todas as chaves e valores da coleção de estado de sessão.
Abandonar - remove todos os objetos armazenados em uma Sessão. Se você não chamar o método Abandon explicitamente, o servidor removerá esses objetos e destruirá a sessão quando ela atingir o tempo limite.
Ele também gera eventos como Session_End .
Session.Clear pode ser comparado a remover todos os livros da prateleira , enquanto Session.Abandon é mais como jogar fora a prateleira inteira .
Você diz:
Isso está correto enquanto você está fazendo isso em apenas uma solicitação .
Na próxima solicitação, a sessão será diferente. Mas o ID da sessão pode ser reutilizado para que permaneça o mesmo.
Se você for usar Session.Clear, terá a mesma sessão em muitas solicitações.
Geralmente, na maioria dos casos, você precisa usar Session.Clear.
Você pode usar Session.Abandon se tiver certeza de que o usuário vai deixar seu site.
Então, de volta às diferenças:
fonte
Session.Clear
pode ser comparado a remover todos os livros da estante imediatamente , enquantoSession.Abandon
é mais como dizer "jogue fora a estante inteira e me avise quando terminar ".Quando você
Abandon()
uma Session, você (ou melhor, o usuário) obterá um novo SessionId (na próxima solicitação). Quando vocêClear()
usa uma Session, todos os valores armazenados são removidos, mas o SessionId permanece intacto.fonte
Este é tipo de coberto pelas várias respostas acima, mas a primeira vez que li este artigo eu perdi um fato importante, o que levou a um pequeno bug no meu código ...
Session.Clear()
LIMPAR os valores de todas as chaves, mas NÃO fará com que o evento de finalização da sessão seja acionado.Session.Abandon()
NÃO apagará os valores na solicitação atual. SE outra página for solicitada, os valores serão perdidos para aquela. Porém, abandonar VAI lançar o evento.Então, no meu caso (e talvez no seu?), Eu precisava ser
Clear()
seguido porAbandon()
.fonte
É porque quando o método Abandon é chamado, o objeto Session atual é enfileirado para exclusão, mas não é realmente excluído até que todos os comandos de script na página atual tenham sido processados. Isso significa que você pode acessar variáveis armazenadas no objeto Sessão na mesma página da chamada ao método Abandon, mas não em quaisquer páginas da Web subsequentes.
Por exemplo, no script a seguir, a terceira linha imprime o valor Mary. Isso ocorre porque o objeto Session não é destruído até que o servidor termine de processar o script.
Se você acessar a variável MyName em uma página da Web subsequente, ela estará vazia. Isso ocorre porque MyName foi destruído com o objeto de Sessão anterior quando a página contendo o exemplo anterior concluiu o processamento.
da MSDN Session.Abandon
fonte
Limpar uma sessão remove os valores que foram armazenados lá, mas você ainda pode adicionar novos lá. Depois de destruir a sessão, você não pode adicionar novos valores lá.
fonte
Clear-its remove a chave ou os valores da coleção de estado da sessão.
abandon-its remove ou exclui objetos de sessão da sessão.
fonte
irá destruir / matar toda a sessão.
remove / limpa os dados da sessão (ou seja, as chaves e os valores da sessão atual), mas a sessão permanecerá ativa.
Compare com o método Session.Abandon (), Session.Clear () não cria a nova sessão, apenas transforma todas as variáveis na sessão em NULL.
O ID da sessão permanecerá o mesmo em ambos os casos, desde que o navegador não seja fechado.
Ele remove todas as chaves e valores da coleção de estado de sessão.
Ele exclui um item da coleção de estado de sessão.
Ele exclui um item em um índice especificado da coleção de estado de sessão.
Esta propriedade especifica o período de tempo limite atribuído ao objeto de Sessão para o aplicativo. (o tempo será especificado em minutos).
Se o usuário não atualizar ou solicitar uma página dentro do período de tempo limite, a sessão será encerrada.
fonte
A existência de sessionid pode causar o ataque de fixação de sessão que é um dos pontos de conformidade com o PCI. Para remover o sessionid e superar o ataque de fixação de sessão, leia esta solução - Como evitar a vulnerabilidade de fixação de sessão no ASP.NET? .
fonte
Acho que seria útil usar em
Session.Clear()
vez de usarSession.Abandon()
.Porque os valores ainda existem na sessão depois de chamar mais tarde, mas são removidos depois de chamar a primeira.
fonte
Uma coisa a ser observada aqui é que Session.Clear remove itens imediatamente, mas Session.Abandon marca a sessão para ser abandonada no final da solicitação atual. Isso significa simplesmente que suponha que você tentou acessar o valor no código logo após o comando session.abandon ter sido executado, ele ainda estará lá. Portanto, não se confunda se o seu código simplesmente não está funcionando, mesmo depois de emitir o comando session.abandon e imediatamente fazer alguma lógica com a sessão.
fonte