Olá pessoal, neste artigo veremos os conceitos e a criação de um exemplo prático do uso dos Cookies.
Os Cookies são, assim como o ViewState, uma forma de garantir a persistência dos dados e a manutenção do estado. Ele nada mais é do que um pequeno arquivo de texto armazenado na máquina do usuário.
Sua maior vantagem é que você pode identificar o usuário mesmo dias depois de seu acesso a página. Este recurso é extremamente utilizado em sites de comércio eletrônico, o famoso e-commerce, para exibir as preferências de cada usuário, como os últimos produtos pesquisados, por exemplo, ou mesmo para informar ao usuário a data de sua última visita ao site.
Em contrapartida, sua maior desvantagem é que o usuário pode desabilitar os cookies em seu navegador (o que hoje em dia muitos fazem).
Explicado os conceitos, vamos à prática. Crie uma nova aplicação do tipo Web Application, dando a ela o nome ExemploCookies e dê OK. Na Default.aspx adicione três Labels, dois Textboxes, três Buttons, um LinkButton e um ListBox, conforme a Figura 1.
Usei os seguintes ID’s (cito os mais relevantes): txtNome, txtValor, btnGravar, btnRecuperar, btnGravarItens, lnkAtualizar, lstCookies com a propriedade AutoPostBack como True (importante alterá-la, pois o padrão é False) e lblValorCookie com a propriedade Text vazia.
A ideia é a seguinte: gravaremos alguns cookies, recuperá-los manualmente, atualizar o ListBox com os cookies que acabamos de gravar e ainda gravar vários cookies.
Vamos começar criando o método para Gravar os cookies. Vá à página de códigos e crie o método a seguir (com comentários explicativos):
private void Gravar()
{
try
{
//Se meu browser requisitar cookies
if (Request.Browser.Cookies)
{
//Instancio a classe Cookie passando como parâmetro o txtNome
HttpCookie objCookie = new HttpCookie(this.txtNome.Text);
//O value do meu objeto instanciado recebe o txtValor
objCookie.Value = this.txtValor.Text;
//Defino quanto tempo meu cookie levará para se expirar
objCookie.Expires = DateTime.Now.AddMinutes(5);
//Uso o Response pra gravar meu cookie
Response.Cookies.Add(objCookie);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
Não se esqueça de chamar o método no botão Gravar. Além disso, crie o método para o botão Recuperar e faça o mesmo chamando no evento Click do btnRecuperar:
private void Recuperar()
{
try
{
//Crio o cookie passando o txtNome como valor, por meio do Request
HttpCookie objCookie = Request.Cookies[txtNome.Text];
//Verifico se meu cookie está diferente de nulo,
//se estiver atribuo o valor do cookie ao txtValor
if (objCookie != null)
{
this.txtValor.Text = objCookie.Value;
}
else
{
this.txtNome.Text = "Erro, o Cookie está vazio!";
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
Em seguida crie o método para Atualizar os cookies. Será um laço que percorrerá todos os cookies existentes e os exibirá em nosso ListBox (parecido com o exemplo do artigo sobre QueryString):
private void Atualizar()
{
try
{
//Declaro uma variável do tipo string, que irá armazenar os valores
string totalCookies;
//Limpo o ListBox
this.lstCookies.Items.Clear();
//Faço um laço para percorrer os valores(keys) dos cookies
foreach (string objString in Request.Cookies.Keys)
{
//Minha variável recebe a contagem dos valores dos cookies,
//por meio do método Count
totalCookies = Request.Cookies[objString].Values.Keys.Count.ToString();
//Adiciono os valores em meu ListBox
lstCookies.Items.Add(new ListItem(objString + "(" + totalCookies + ")",
Request.Cookies[objString].Value));
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
Não se esqueça de chamá-lo no evento Click do LinkButton.
Agora crie o método que irá Gravar vários itens (esse método grava vários valores dentro do mesmo cookie):
private void GravarVariosItens()
{
try
{
//Instancio a classe Cookie passando como parâmetro o nome do meu cookie
HttpCookie objCookie = new HttpCookie("nomeCookie");
//Adiciono os valores ao meu Cookie
objCookie["Valor1"] = " Valor1";
objCookie["Valor2"] = " Valor2";
objCookie["Valor3"] = " Valor3";
objCookie["Valor4"] = " Valor4";
objCookie["Valor5"] = " Valor5";
//Defino quanto tempo meu cookie levará para se expirar
objCookie.Expires = DateTime.Now.AddDays(1);
//Uso o Response pra gravar meu cookie
Response.Cookies.Add(objCookie);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
Finalizando, vá ao modo Design de sua página, clique no ListBox, e nos eventos dele e dê dois cliques no evento SelectedIndexChanged. Nele, faça o seguinte:
protected void lstCookies_SelectedIndexChanged(object sender, EventArgs e)
{
//Se o valor do ListBox for diferente de nulo, o passo para o lblValorCookie
if (lstCookies.SelectedItem.Value != string.Empty)
{
lblValorCookie.Text = lstCookies.SelectedItem.Value;
}
}
Desta forma a cada valor selecionado no ListBox, o mesmo é automaticamente passado ao meu Label.
Códigos prontos, aperte F5 para rodar a aplicação e clique em OK para habilitar ao Web.Config a compilação.
Faça alguns testes, digite um nome qualquer e um valor e clique em Gravar. Depois clique em Atualizar e selecione o valor que aparece no ListBox, como mostra a Figura 2.
Perceba que ele armazenou o valor, então agora digite mais alguns nomes e valores. Em seguida clique no botão Atualizar e navegue pelos Cookies, como mostra a Figura 3.
Vamos fazer mais um teste, dessa vez só digite o nome que já foi gravado e clicar em Recuperar, como mostra a Figura 4.
Agora digite um nome e um valor qualquer e clique no botão Gravar Vários Itens. Atualize o ListBox e clique no valor que você acabou de gravar, como mostra a Figura 5.
Perceba que ele exibe vários valores (inclusive o número de valores no ListBox, entre parênteses). Você pode também fazer o teste apagando os cookies de seu browser e em seguida clique no botão Recuperar, como mostra a Figura 6.
Ele já exibe a mensagem que configuramos no else do método Recuperar.
Assim vimos diversas formas de trabalhar com cookies.