Obter cookie por nome


362

Eu tenho um getter para obter o valor de um cookie.

Agora eu tenho 2 cookies pelo nome shares=e pelo nomeobligations= .

Eu quero fazer esse getter apenas para obter os valores do cookie de obrigações.

Como eu faço isso? Então, os fordados são divididos em valores separados e os são colocados em uma matriz.

 function getCookie1() {
    // What do I have to add here to look only in the "obligations=" cookie? 
    // Because now it searches all the cookies.

    var elements = document.cookie.split('=');
    var obligations= elements[1].split('%');
    for (var i = 0; i < obligations.length - 1; i++) {
        var tmp = obligations[i].split('$');
        addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
    }
 }

Existe alguma resina que você não está fazendo apenas uma matriz?
WebLacky3rdClass

tornando o cookie uma matriz, devo dizer.
WebLacky3rdClass

Não, como eu poderia fazer isso?


Você pode aceitar uma resposta: sua pergunta ainda está marcada como sem resposta.
Soleil - Mathieu Pré -ot

Respostas:


499

Uma abordagem, que evita a iteração sobre uma matriz, seria:

function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}

Passo a passo

A divisão de uma sequência por token produzirá uma matriz com uma sequência (o mesmo valor), caso o token não exista em uma sequência, ou uma matriz com duas sequências, caso o token seja encontrado em uma sequência.

O primeiro elemento (à esquerda) é uma sequência do que estava antes do token, e o segundo (à direita) é a sequência do que estava após o token.

(OBSERVAÇÃO: caso a cadeia inicie com um token, o primeiro elemento é uma cadeia vazia)

Considerando que os cookies são armazenados da seguinte maneira:

"{name}={value}; {name}={value}; ..."

para recuperar um valor específico do cookie, só precisamos obter uma string que é depois de "; {name} =" e antes da próxima ";". Antes de realizar qualquer processamento, anexamos a sequência de cookies com ";", para que todos os nomes de cookies, incluindo o primeiro, sejam colocados entre ";" e "=":

"; {name}={value}; {name}={value}; ..."

Agora, podemos primeiro dividir por "; {name} =", e se o token for encontrado em uma string de cookie (ou seja, temos dois elementos), terminaremos com o segundo elemento sendo uma string que começa com o valor do cookie. Em seguida, extraímos isso de uma matriz (por exemplo, pop) e repetimos o mesmo processo, mas agora com ";" como um token, mas desta vez puxando a corda esquerda (ou seja, shift) para obter o valor real do token.


13
@ user3132564 tentou editar isso, mas na verdade é um comentário: esse método retorna o valor errado quando você pesquisa um sufixo de cookie - se o valor de document.cookie for "FirstName = John" e você chamar getCookie ("Name "), você receberá" John "mesmo que não haja cookie com esse nome. Também não funciona se o nome de um cookie é o sufixo de outro - se document.cookie for "Name = John; LastName = Doe", chamar split ("Name =") retorna uma matriz com três strings e o método não ' t retorne o valor correto para getCookie ("Nome").
Dennis Jaheruddin

20
Aviso sobre a implementação nesta resposta: se houver mais de um cookie com o mesmo nome, nenhum valor de cookie será retornado. Por exemplo, se houver um cookie chamado stackToken definido para os domínios .stackexchange.com e programmers.stackexchange.com, se você chamar getCookie ("stackToken"), nenhum valor será retornado - parts.length será maior que 2. Se você souber que todos os valores de cookies para o mesmo nome (mas domínio e caminho diferentes) serão os mesmos, consulte a resposta aceita aqui: stackoverflow.com/questions/5639346/…
jlpp:

7
@DennisJaheruddin - Parece que o problema do sufixo foi corrigido.
19415 Nathan JB

2
@ NathanJ.Brauer você está correto. Atualizado para resolver esse problema há muito tempo, mas fez uma anotação apenas no changelog, em vez de nos comentários.
Kirlich

há uma falha nisso. Se o cookie "name" e sublinhado em outro nome semelhante, IE 10+também ocorre um erro. Por exemplo: "user": "Joe", "user_name":"Doe"
BOZ

176

Eu preferiria usar uma única expressão regular correspondente no cookie:

window.getCookie = function(name) {
  var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
  if (match) return match[2];
}

OU Também podemos usar como uma função, verifique o código abaixo.

function check_cookie_name(name) 
    {
      var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      if (match) {
        console.log(match[2]);
      }
      else{
           console.log('--something went wrong---');
      }
   }

Agradecimentos aprimorados a Scott Jungwirth nos comentários.


11
Isso pode ter correspondências falsas se dois cookies tiverem o mesmo sufixo. Combina ambos xyz=valuee abcxyz=valuequando name = xyz.
Brent Washburne

3
unescape((document.cookie.match(key + '=([^;].+?)(;|$)') || [])[1] || '');Versão modificada do Glize / dom / Cookies
Valentin Podkamennyi

19
atualize o Regex para new RegExp('(^| )' + name + '=([^;]+)')evitar problemas levantados por @BrentWashburne. Também fiz um teste jsperf para isso e a resposta com os votos mais altos, este sai um pouco por cima, mas é definitivamente menos código e mais fácil de seguir: jsperf.com/simple-get-cookie-by-name
Scott Jungwirth

5
@ScottJungwirth Sim, mas você deve atualizar a declaração de retorno para retornar a correspondência [2];
314 Joe

@ScottJungwirth Por que não new RegExp('(^|;)' + name + '=([^;]+)')? Por nametrás do início de uma linha ou ponto e vírgula, por que um espaço ``?
Junlin

89

use um script para obter cookies:

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

então chame-o:

var value = readCookie('obligations');

Eu roubei o código acima da página de cookies quirksmode. você deveria ler .


7
... que roubou o código do W3schools. Uau. w3schools.com/js/js_cookies.asp
WillWam

Ei, pelo menos eu dei crédito: p também como você sabe que esse era o original?
Mkoryak 23/12/19

É geralmente seguro supor que o W3S o coloque primeiro. Eles abrigam muitos novatos que usam o código Ctrl-C.
WillWam

Na verdade, parece que é o contrário :) Quirksmode é / foi um ótimo site para peculiaridades de navegadores e há uma fonte lá também. scottandrew.com
sunn0

eu amo w3schools. provavelmente a melhor plataforma para idosos
Ralph Dingus

56

Se você usa jQuery, recomendo que você use este plugin:

https://github.com/carhartl/jquery-cookie
https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js

<script type="text/javascript"
 src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js">

Então você pode ler os cookies assim:

var value = $.cookie("obligations");

Além disso, você pode escrever um cookie:

$.cookie('obligations', 'new_value');
$.cookie('obligations', 'new_value', { expires: 14, path: '/' });

Excluir cookie:

$.removeCookie('obligations');

11
Não sei por que isso não foi votado como a melhor resposta realmente. Sim, é jQuery e não javascript, mas ao mesmo tempo é !!!!
Cozzbie

21
O @Cozzbie provavelmente incluir uma biblioteca externa (adicionando outra solicitação http) apenas para buscar um valor de cookie é uma espécie de exagero desnecessário.
rahulserver

Estou recebendo um erro "Uncaught ReferenceError: $ não está definido" em "$ .cookie". Embora eu tenha incluído todas as bibliotecas necessárias, como jquery.min.js e a biblioteca sugerida nesta resposta.
Adarsh ​​Singh

44

Os métodos em algumas das outras respostas que usam uma expressão regular não cobrem todos os casos, principalmente:

  1. Quando o cookie é o último cookie. Nesse caso, não haverá um ponto e vírgula após o valor do cookie.
  2. Quando outro nome de cookie termina com o nome sendo pesquisado. Por exemplo, você está procurando o cookie chamado "one" e existe um cookie chamado "done".
  3. Quando o nome do cookie inclui caracteres que não são interpretados como eles mesmos quando usados ​​em uma expressão regular, a menos que sejam precedidos por uma barra invertida.

O método a seguir lida com esses casos:

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); };
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

Isso retornará null se o cookie não for encontrado. Ele retornará uma string vazia se o valor do cookie estiver vazio.

Notas:

  1. Esta função assume que os nomes dos cookies diferenciam maiúsculas de minúsculas .
  2. document.cookie- Quando isso aparece no lado direito de uma atribuição, representa uma sequência que contém uma lista de cookies separados por ponto e vírgula, que por sua vez são name=valuepares. Parece haver um espaço único após cada ponto e vírgula.
  3. String.prototype.match()- Retorna nullquando nenhuma correspondência é encontrada. Retorna uma matriz quando uma correspondência é encontrada, e o elemento no índice [1]é o valor do primeiro grupo correspondente.

Notas sobre expressões regulares:

  1. (?:xxxx) - forma um grupo não correspondente.
  2. ^ - corresponde ao início da string.
  3. | - separa padrões alternativos para o grupo.
  4. ;\\s* - corresponde a um ponto-e-vírgula seguido por zero ou mais caracteres de espaço em branco.
  5. = - corresponde a um sinal de igual.
  6. (xxxx) - forma um grupo correspondente.
  7. [^;]*- corresponde a zero ou mais caracteres que não sejam ponto-e-vírgula. Isso significa que ele corresponderá caracteres até, mas não incluindo, um ponto-e-vírgula ou o final da sequência.

4
Essa resposta é a melhor e mais curta função que funciona em todos os casos sem falsas correspondências. Ele também tem a melhor explicação de como funciona. No entanto, a função de escape não é explicada e eu pensaria que, se o autor criou o cookie, ele saberia se o nome precisava ser escapado ou não. Então, eu preferiria ver uma função mais curto:function getCookie(name) { var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null; }
Jeff Baker

Se for uma ferramenta genérica, ele deve escapar do nome ou gerar um erro se o nome não puder ser incorporado diretamente no regex. Pessoas que conhecem as restrições de sua aplicação podem remover a fuga ou a guarda.
21416 Joe Lapp

31

4 anos depois, versão ES6 muito mais simples.

function getCookie(name) {
  let cookie = {};
  document.cookie.split(';').forEach(function(el) {
    let [k,v] = el.split('=');
    cookie[k.trim()] = v;
  })
  return cookie[name];
}

Eu também criei uma essência para usá-la como um Cookieobjeto. por exemplo,Cookie.set(name,value) eCookie.get(name)

Isso leu todos os cookies em vez de varrer. Tudo bem para um pequeno número de cookies.


23

Eu modifiquei a função que Jonathan forneceu aqui, usando a expressão regular, você pode obter um valor de cookie por seu nome assim:

function getCookie(name){
    var pattern = RegExp(name + "=.[^;]*")
    var matched = document.cookie.match(pattern)
    if(matched){
        var cookie = matched[0].split('=')
        return cookie[1]
    }
    return false
}

Se retornar string vazia, significa que o cookie existe, mas não tem valor; se retornar false, o cookie não existe. Eu espero que isso ajude.


Apenas curioso, por que você não usou varna linha 3? matched = ...
Victorio Berra

Desculpe por isso, esqueci de escrever.
Mohyaddin Alaoddin

14

Aqui está uma lista para obter um cookie com um nome específico, sem a necessidade de qualquer lib externa:

var cookie = ("; "+document.cookie).split("; YOUR_COOKIE_NAME=").pop().split(";").shift();

Esta resposta é baseada na solução brilhante de Kirlich . O único compromisso dessa solução é que você receberá uma string vazia quando o cookie não existir. Na maioria dos casos, isso não deve ser um desagrado.


10

Eu sei que é uma pergunta antiga, mas me deparei com esse problema também. Apenas para constar, existe uma pequena API na página da web para desenvolvedores do mozilla .

Você pode obter qualquer cookie pelo nome usando apenas JS. O código também é IMHO mais limpo (exceto para a linha longa, que eu tenho certeza que você pode consertar facilmente).

function getCookie(sKey) {
    if (!sKey) { return null; }
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}

Conforme declarado nos comentários, saiba que esse método pressupõe que a chave e o valor foram codificados usando encodeURIComponent (). Remova decode & encodeURIComponent () se a chave e o valor do cookie não foram codificados.


11
Lembre-se de que o método assume que o nome e o valor do cookie foram codificados usando encodeURIComponent()quando o cookie foi definido, o que será verdadeiro se você usar a função complementar para definir o cookie, mas nem sempre será esse o caso. teste
John S

@JohnS Poderíamos simplesmente remover o decodeURIComponent, certo? (Se não o usássemos para definir o cookie?) Ainda funcionaria?
NiCk Newman 29/03/2015

Sim, acabou de remover o decodeURI e este regexp é um monstro. Obrigado Marc, votou!
NiCk Newman 29/03/2015

10

Você pode usar o js-cookie biblioteca para obter e definir cookies JavaScript.

Inclua no seu HTML:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>

Para criar um cookie:

Cookies.set('name', 'value');

Para ler um cookie:

Cookies.get('name'); // => 'value'

8

Aqui está uma versão bastante curta

 function getCookie(n) {
    let a = `; ${document.cookie}`.match(`;\\s*${n}=([^;]+)`);
    return a ? a[1] : '';
}

Observe que fiz uso das seqüências de caracteres do modelo do ES6 para compor a expressão regex.


2
A melhor resposta a partir de agora. Usa os recursos do ES6. É 2017 e as pessoas ainda usando var, +para concatenar, etc. -.-'
Elias Soares

@EliasSoares Qual é o problema de usar var?
mrReiha


Não é um problema, mas usando obstrução é uma boa prática, uma vez que têm vantagens em muitas situações, e quase sem desvantagens
Elias Soares

7

Usar object.defineProperty

Com isso, você pode acessar facilmente os cookies

Object.defineProperty(window, "Cookies", {
    get: function() {
        return document.cookie.split(';').reduce(function(cookies, cookie) {
            cookies[cookie.split("=")[0]] = unescape(cookie.split("=")[1]);
            return cookies
        }, {});
    }
});

A partir de agora você pode apenas fazer:

alert( Cookies.obligations );

Isso também será atualizado automaticamente; portanto, se você alterar um cookie, o Cookiesmesmo também será alterado.


2
Perfeito! exceto que ele não funcionará para objetos que tenham alguns caracteres como traços (como nomes de cookies) e, ao dividir, os objetos terão um espaço em branco primeiro, então eu vou cookies[(cookie.split("=")[0]).replace(/ /g,'')] = ... Obrigado!!
Samuel Elh 17/07/16

@Samuel ELH corrigir, mas você também pode usar .trim () em vez de substituir (/ / g, '')
mtizziani

7

Kirlich deu uma boa solução. No entanto, ele falha quando há dois valores de cookie com nomes semelhantes. Aqui está uma correção simples para esta situação:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length >= 2) return parts.pop().split(";").shift();
}

6

sempre funciona bem:

function getCookie(cname) {
    var name = cname + "=",
        ca = document.cookie.split(';'),
        i,
        c,
        ca_length = ca.length;
    for (i = 0; i < ca_length; i += 1) {
        c = ca[i];
        while (c.charAt(0) === ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) !== -1) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function setCookie(variable, value, expires_seconds) {
    var d = new Date();
    d = new Date(d.getTime() + 1000 * expires_seconds);
    document.cookie = variable + '=' + value + '; expires=' + d.toGMTString() + ';';
}

Não há requisitos para jQuery ou qualquer coisa. JavaScript puro e antigo.


6
function getCookie(name) {
    var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
    if (pair)
       return pair.split('=')[1]
}

6

Função simples para Obter cookie com o nome do cookie:

function getCookie(cn) {
    var name = cn+"=";
    var allCookie = decodeURIComponent(document.cookie).split(';');
    var cval = [];
    for(var i=0; i < allCookie.length; i++) {
        if (allCookie[i].trim().indexOf(name) == 0) {
            cval = allCookie[i].trim().split("=");
        }   
    }
    return (cval.length > 0) ? cval[1] : "";
}

6

Aparentemente, o MDN nunca ouviu falar da classe de caracteres regex de limite de palavras \b, que corresponde ao contíguo \w+que é delimitado de ambos os lados por \W+:

getCookie = function(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : null;
};

var obligations = getCookie('obligations');

5

Parece-me que você pode dividir os pares de valor-chave do cookie em uma matriz e basear sua pesquisa nisso:

var obligations = getCookieData("obligations");

Que executa o seguinte:

function getCookieData( name ) {
    var pairs = document.cookie.split("; "),
        count = pairs.length, parts; 
    while ( count-- ) {
        parts = pairs[count].split("=");
        if ( parts[0] === name )
            return parts[1];
    }
    return false;
}

Violino: http://jsfiddle.net/qFmPc/

Ou possivelmente até o seguinte:

function getCookieData( name ) {
    var patrn = new RegExp( "^" + name + "=(.*?);" ),
        patr2 = new RegExp( " " + name + "=(.*?);" );
    if ( match = (document.cookie.match(patrn) || document.cookie.match(patr2)) )
        return match[1];
    return false;
}

11
existe um método para usar document.cookie.indexOf (name) e comparar?

@AndrejHefner Você poderia, no entanto, isso corresponderia a substrings. Portanto, se você tiver um nome de cookie "foobar" e um chamado "bar", poderá confundir a "barra" em "foobar" com a chave "bar".
Sampson

@AndrejHefner Por favor, veja o método posterior, que deve ser mais rápido, uma vez que verifica se há uma correspondência na string.
Sampson

11
O segundo método possui um bug no qual não encontra o último valor do cookie, pois sempre procura um; no fim. Uma versão de correção seria:function getCookieData( name ) { var patrn = new RegExp( "(?:^| )" + name + "=(.*?)(?:;|$)" ); if ( match = (document.cookie.match(patrn) )) return match[1]; return false; }
Oz Solomon

5

Nos meus projetos, uso a seguinte função para acessar os cookies por nome

function getCookie(cookie) {
    return document.cookie.split(';').reduce(function(prev, c) {
        var arr = c.split('=');
        return (arr[0].trim() === cookie) ? arr[1] : prev;
    }, undefined);
}

4

Se você só precisa verificar se existe algum cookie, faça o seguinte:

document.cookie.split('logged=true').length == 2

se o cookie logado = true existir, você receberá 2, se não 1.

logado = verdadeiro - altere para o nome do cookie = valor ou apenas um nome


11
Não seria mais legível usar .indexOf() >= 0?
Vic Seedoubleyew 23/09/19

3

Já existem respostas legais aqui para obter o cookie, mas aqui está a minha própria solução:

function getcookie(cookiename){
var cookiestring  = document.cookie;
var cookiearray = cookiestring.split(';');
for(var i =0 ; i < cookiearray.length ; ++i){ 
    if(cookiearray[i].trim().match('^'+cookiename+'=')){ 
        return cookiearray[i].replace(`${cookiename}=`,'').trim();
    }
} return null;
}

uso: `

     getcookie('session_id');
   // gets cookie with name session_id

3

definido por javascript

document.cookie = 'cookiename=tesing';

obtenha pelo jquery com o plugin jquery-cookie

var value = $.cookie("cookiename");

alert(value);

@cytsunny - isso ocorre porque você precisa ter o plugin de cookies jquery para usá-lo.
Alex Standiford

Uau .... que informação importante faltava anteriormente ... Mas pelo link que você forneceu, parece que o proprietário da biblioteca decidiu que era melhor remover a dependência do jquery.
cytsunny


2

Minha solução é esta:

function getCookieValue(cookieName) {
    var ca = document.cookie.split('; ');
    return _.find(ca, function (cookie) {
        return cookie.indexOf(cookieName) === 0;
    });
}

Esta função usa a função Underscorejs _.find. Retorna indefinido se o nome do cookie não existir


2

Eu fiz dessa maneira. Para que eu receba um objeto para acessar para separar os valores. Com isso, você pode passar o cookie para o pai e, em seguida, você pode acessar seus valores pelas chaves como

var cookies=getCookieVal(mycookie);
alert(cookies.mykey);
function getCookieVal(parent) {
            var cookievalue = $.cookie(parent).split('&');
            var obj = {};
            $.each(cookievalue, function (i, v) {
                var key = v.substr(0, v.indexOf("="));
                var val = v.substr(v.indexOf("=") + 1, v.length);

                obj[key] = val;

            });
            return obj;
        }  

1

Uma abordagem funcional para encontrar cookies existentes. Ele retorna uma matriz e suporta várias ocorrências com o mesmo nome. Ele não suporta correspondência parcial de chave, mas é trivial substituir o === no filtro por um regex.

function getCookie(needle) {
    return document.cookie.split(';').map(function(cookiestring) {
        cs = cookiestring.trim().split('=');

        if(cs.length === 2) {
            return {'name' : cs[0], 'value' : cs[1]};
        } else {
            return {'name' : '', 'value' : ''};
        }
    })
    .filter(function(cookieObject) { 
        return (cookieObject.name === needle);
    });
}

1

Basta usar a seguinte função (um código javascript puro)

const getCookie = (name) => {
 const cookies = Object.assign({}, ...document.cookie.split('; ').map(cookie => {
    const name = cookie.split('=')[0];
    const value = cookie.split('=')[1];

    return {[name]: value};
  }));

  return cookies[name];
};

1

Obter cookie pelo nome, basta passar o nome do cookie para a função abaixo

function getCookie(cname) {
  var name = cname + "=";
  var decodedCookie = decodeURIComponent(document.cookie);
  var ca = decodedCookie.split(';');
  for(var i = 0; i <ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "";
}

0

A função a seguir retornará um key-valuepar do cookie necessário, onde keyé o nome do cookie e valueserá o valor do cookie.

/**
 * Returns cookie key-value pair
 */
var getCookieByName = function(name) {
    var result = ['-1','-1'];
    if(name) {
        var cookieList = document.cookie.split(';');
        result = $.grep(cookieList,function(cookie) { 
            cookie = cookie.split('=')[0];
            return cookie == name;
        });
    }
    return result;
};

0

Exemplo de cookies: exemplo JS:

document.cookies = {
   create : function(key, value, time){
     if (time) {
         var date = new Date();
         date.setTime(date.getTime()+(time*24*60*60*1000));
         var expires = "; expires="+date.toGMTString();
     }
     else var expires = "";
     document.cookie = key+"="+value+expires+"; path=/";
   },
   erase : function(key){
     this.create(key,"",-1);
   },
   read : function(key){
     var keyX = key + "=";
     var ca = document.cookie.split(';');
     for(var i=0;i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
          if (c.indexOf(keyX) == 0) return   c.substring(keyX.length,c.length);
     }
     return null;
   }
}

Armazene matrizes e objetos com json ou xml

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.