Excluir cookie por nome?

151

Como posso excluir um cookie específico com o nome roundcube_sessauth?

Não deve o seguinte:

function del_cookie(name) {
    document.cookie = 'roundcube_sessauth' + 
    '=; expires=Thu, 01-Jan-70 00:00:01 GMT;';
} 

E depois:

<a href="javascript:del_cookie(name);">KILL</a>

Matar o roundcube_sessauthbiscoito?

Charlie
fonte
1
name? Qual o sentido disso? Ou é uma ressaca de uma versão mais versátil que permite especificar o nome do cookie?
22412
Não pense que isso é um tolo. Ele pergunta especificamente sobre como limpar todos os cookies.
22412
1
Não quero excluir todos os cookies ... Apenas um. Encontrei o código básico pesquisando no Google. E é claro que eu tentei. @Paxdiablo Eu assumi o nome do cookie, mas posso estar completamente errado.
Charlie
@paxdiablo - ...How can I delete a specific cookie
Derek 朕 會 功夫
1
@Derek et al, você parece entender mal. Eu estava afirmando que o idiota proposto de Gabe não era um idiota porque o idiota proposto perguntou sobre a exclusão de todos os cookies e essa pergunta pergunta sobre a exclusão de um cookie específico . Eu não estava reclamando sobre esta questão de nenhuma forma, forma ou formato :-) #
385

Respostas:

252

Você deve definir o caminho no qual o cookie existe para garantir que você esteja excluindo o cookie correto.

function set_cookie(name, value) {
  document.cookie = name +'='+ value +'; Path=/;';
}
function delete_cookie(name) {
  document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
}

Se você não especificar o caminho, o navegador definirá um cookie em relação à página em que você está atualmente; portanto, se você excluir o cookie enquanto estiver em uma página diferente, o outro cookie continuará existindo.

Edite com base no comentário de @Evan Morrison.
Esteja ciente de que, em alguns casos, para identificar o cookie correto, o Domainparâmetro é necessário.
Geralmente é definido como Domain=.yourdomain.com.
Colocar um ponto na frente do seu nome de domínio significa que esse cookie pode existir em qualquer subdomínio ( wwwtambém conta como subdomínio).

Além disso, como mencionado na resposta de @ RobertT, os HttpOnlycookies não podem ser excluídos com JavaScript no lado do cliente.

emii
fonte
23
Isso estava me deixando louco! Depois de adicionar Path = /, consegui excluir. Obrigado!
duyn9uyen 12/09
12
Esta deve ser a resposta correta, Pathna maioria dos casos não funciona sem .
SuperMarco
9
Não consegui excluir um cookie até adicionar o caminho e o 'Domínio = valor correto; "... Assim, a minha declaração foi: document.cookie = "cookieName =; path = /; expira = Thu, 01 janeiro de 1970 00:00:01 GMT; domain = .meudominio.com"
Evan Morrison
1
Essa solução ainda funciona, mas pode ser escrita de forma um pouco mais concisa Max-Age=0, se você se importar com essas coisas.
MaxRafferty
181

Para excluir um cookie, defina a expiresdata como algo no passado. Uma função que faz isso seria.

var delete_cookie = function(name) {
    document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';
};

Em seguida, para excluir um cookie chamado roundcube_sessauthjust do.

delete_cookie('roundcube_sessauth');
paxdiablo
fonte
1
Eu sinto que isso deve estar funcionando (parece que deve funcionar: D!), Mas estou visualizando os cookies definidos por minha página no Firefox e quando clico no botão "KILL", o cookie não está sendo excluído. Alguma idéia do porquê?
Charlie
Isso funciona no Google Chrome. Instale o firebug e veja se há algum erro.
1
Sem erros, acho que não está excluindo o cookie no Roundcube. Provavelmente exclui outros cookies.
Charlie
39
Para usuários que procuram uma resposta para esta pergunta, consulte a resposta abaixo. A path=/chave é importante para a compatibilidade do navegador.
23615 ben ben emps15:
2
Esta resposta não funcionou para mim no Chrome, não tentei no Firefox. Mas a resposta da emii abaixo funcionou.
Daniel F
11

// se passado exMins = 0, ele será excluído assim que for criado.

function setCookie(cname, cvalue, exMins) {
    var d = new Date();
    d.setTime(d.getTime() + (exMins*60*1000));
    var expires = "expires="+d.toUTCString();  
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

setCookie('cookieNameToDelete','',0) // this will delete the cookie.
Kishor Patil
fonte
exMins é indefinido neste exemplo, você provavelmente significava exdays
bhurlow
Sim .. exdays argumento em vez Renomear para exMins .. obrigado #BhBh
Kishor Patil
7

Não tenho muita certeza se essa foi a situação da versão do Roundcube de maio de 12, mas, para a atual, a resposta é que você não pode excluir o roundcube_sessauthcookie do JavaScript, pois está marcado como HttpOnly. E isso significa que não é acessível a partir do código JS do lado do cliente e pode ser removido apenas pelo script do lado do servidor ou pela ação direta do usuário (através de algumas mecânicas do navegador, como depurador integrado ou algum plug-in).

RobertT
fonte
1

Você pode tentar esta solução

var d = new Date();
d.setTime(d.getTime());
var expires = "expires="+d.toUTCString();
document.cookie = 'COOKIE_NAME' + "=" + "" + ";domain=domain.com;path=/;expires=" + expires;
Nafees
fonte
0

No meu caso, usei o código de golpe para um ambiente diferente.

  document.cookie = name +`=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;Domain=.${document.domain.split('.').splice(1).join('.')}`;
Amir Movahedi
fonte