Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.javascript > #39780
| From | Thomas 'PointedEars' Lahn <PointedEars@web.de> |
|---|---|
| Newsgroups | comp.lang.javascript |
| Subject | Re: Create cookie from ID of <a> tag |
| Date | 2021-03-26 23:22 +0100 |
| Organization | PointedEars Software (PES) |
| Message-ID | <2196370.ElGaqSPkdT@PointedEars.de> (permalink) |
| References | (5 earlier) <cca12429-db8b-4747-990f-0f9e2fedba5dn@googlegroups.com> <s3k5e5$aot$1@dont-email.me> <2578953.mvXUDI8C0e@PointedEars.de> <slrns5s5ue.49m.jon+usenet@raven.unequivocal.eu> <4641170.31r3eYUQgx@PointedEars.de> |
Thomas 'PointedEars' Lahn wrote:
> Jon Ribbens wrote:
>> On 2021-03-26, Thomas 'PointedEars' Lahn <PointedEars@web.de> wrote:
>>> That is *very* inefficient and error-prone. Consider this:
>>>
>>> function readCookie (name)
>>> {
>>> return (
>>> (
>>> document.cookie.split(';')
>>> .map((cookie) => cookie.split('='))
>>> .filter((cookie) => cookie[0] == name) || []
>>> )[0] || []
>>> )[1];
>>> }
>>
>> Bear in mind this will fail on cookies whose values contain an '='.
>
> It will NOT fail, but it will return an incomplete value.
>
> It is possible indeed for a read cookie value to contain an unescaped “=”
> character:
>
> document.cookie = 'foo=bar=baz';
>
> creates a session cookie with the name “foo” and the value “bar=baz”, and
> after that “document.cookie” contains the substring “bar=baz” unescaped
> (in Chromium).
>
> Thank you for pointing that out.
>
> It is recommended to use the encodeURIComponent() function on the value to
> compatibly avoid storing this and other problematic/forbidden cookie
> values:
>
> document.cookie = 'foo=' + encodeURIComponent('bar=baz');
>
> stores the value “bar%3Dbaz”.
>
> Correspondingly, decodeURIComponent() should be used then when reading
> cookie values:
>
> <https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie>
This was poorly worded. I mean: It is recommended to use
encodeURIComponent() to allow storing cookie values that would otherwise not
be able to be stored, for example values containing “;”; this *also* avoids
the problem of dealing with “=” because then there are no unescaped “=” in
cookie values, and the escaped “=” do not have to be treated differently
than the other escaped characters.
It actually appears to be *necessary* to not simply split on “;”, but
consider whitespace after “;”, so a RegExp SHOULD be used for
splitting/matching.
As I keep thinking about this, one would hope that after all this time that
cookies have been around, and given my impression that cookies are not going
away anytime soon, a standard DOM attribute and built-in property will
finally be introduced to make dealing with cookies easier and less error-
prone.
I would suggest
document.cookies
for that. The Web IDL¹ for it could be (similar to the Storage interface²)
[Exposed=Document]
interface mixin DocumentStorage {
readonly attribute Cookies cookies;
}
[Exposed=DocumentStorage]
interface Cookies {
readonly attribute unsigned long length;
DOMString? name(unsigned long index);
sequence <DOMString> names();
sequence <DOMString> values();
sequence <record <DOMString, CookieAttributes>> items();
getter DOMString? getItem(DOMString name);
boolean hasItem(DOMString name);
setter boolean setItem(DOMString name, DOMString value);
setter boolean setItem(DOMString name, CookieAttributes attributes);
deleter boolean removeItem(DOMString name);
boolean clear();
}
dictionary CookieAttributes {
required DOMString value;
DOMString path = Location::pathname;
unsigned long? maxAge = null; /* default: end of session */
/* or unsigned long, but Date would be more convenient */
Date? expires = null; /* default: at the end of the session */
DOMString domain = Location::hostname;
boolean secure = false;
boolean sameSite = false;
}
Then we could finally simply write
/* Get the number of readable cookies */
console.log(document.cookies.length);
/* Get a cookie based on the order in which it was saved */
console.log(document.cookies[document.cookies.name(1)]);
/* Retrieve all cookie names an Array */
console.log(document.cookies.names());
/* Retrieve all cookie values an Array */
console.log(document.cookies.values());
/* Retrieve all cookies as an object */
console.log(document.cookies.items());
/* Save/modify session cookie with name “foo” and value “bar=baz” */
document.cookies['foo'] = 'bar=baz';
/* equivalent to */
document.cookies.setItem('bla', 'bar=baz');
/* Save persistent secure cookie with name “bla” and value “bar=baz” */
document.cookies['bla'] = {
value: 'bar=baz',
expires: Date.tomorrow, /* “a man can dream, though” */
secure: true
};
/* equivalent to */
document.cookies.setItem('bla', {
value: 'bar=baz',
expires: Date.tomorrow, /* “a man can dream, though” */
secure: true
});
/* Read the cookie with name “foo” */
console.log(document.cookies['foo']);
/* equivalent to */
console.log(document.cookies.getItem('foo'));
/* Delete the cookie with name “foo” */
delete document.cookies['foo'];
/* equivalent to */
document.cookies.removeItem('foo');
/* Delete all readable cookies for this URI */
document.cookies.clear();
instead of all the shebang with constructing and parsing strings. [In fact,
it is already possible to use ECMAScript Ed. 6 features to implement this,
although I would not recommend attempting to modify the document object (as
it is a host object).]
On the other hand, we have the Web Storage API.³ One major advantage of
Storage over cookies, in addition to currently easier data handling, is that
nothing of it is sent in the HTTP request; one major disadvantage of Storage
over cookies is that the former does not provide for a mechanism to let data
expire after a specific time: .localStorage stores the data forever (until
explicitly deleted), and .sessionStorage only for the current session. As a
result of the former, storage data can easily fill up the client’s disk
space with garbage that is never discarded, especially as the length of a
Storage item can be much longer than a cookie value.
_______
¹ <https://heycam.github.io/webidl/>
² <https://html.spec.whatwg.org/multipage/webstorage.html#the-storage-interface>
³ <https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API>
--
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.
Back to comp.lang.javascript | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Create cookie from ID of <a> tag Daniele Ferrarese <daniele.seversrl@gmail.com> - 2021-03-24 09:36 -0700
Re: Create cookie from ID of <a> tag The Natural Philosopher <tnp@invalid.invalid> - 2021-03-24 17:54 +0000
Re: Create cookie from ID of <a> tag Daniele Ferrarese <daniele.seversrl@gmail.com> - 2021-03-25 01:05 -0700
Re: Create cookie from ID of <a> tag The Natural Philosopher <tnp@invalid.invalid> - 2021-03-25 09:13 +0000
Re: Create cookie from ID of <a> tag Daniele Ferrarese <daniele.seversrl@gmail.com> - 2021-03-25 02:21 -0700
Re: Create cookie from ID of <a> tag Daniele Ferrarese <daniele.seversrl@gmail.com> - 2021-03-25 03:23 -0700
Re: Create cookie from ID of <a> tag Daniele <webmaster@appliserver.com> - 2021-03-26 09:19 +0100
Re: Create cookie from ID of <a> tag Daniele Ferrarese <daniele.seversrl@gmail.com> - 2021-03-26 01:57 -0700
Re: Create cookie from ID of <a> tag Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2021-03-26 17:33 +0100
Re: Create cookie from ID of <a> tag Jon Ribbens <jon+usenet@unequivocal.eu> - 2021-03-26 17:20 +0000
Re: Create cookie from ID of <a> tag Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2021-03-26 19:35 +0100
Re: Create cookie from ID of <a> tag Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2021-03-26 23:22 +0100
Re: Create cookie from ID of <a> tag "Michael Haufe (TNO)" <tno@thenewobjective.com> - 2021-03-26 15:39 -0700
Re: Create cookie from ID of <a> tag Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2021-03-31 00:58 +0200
Re: Create cookie from ID of <a> tag "Michael Haufe (TNO)" <tno@thenewobjective.com> - 2021-03-30 19:58 -0700
Re: Create cookie from ID of <a> tag Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2021-04-01 10:09 +0200
Re: Create cookie from ID of <a> tag "Michael Haufe (TNO)" <tno@thenewobjective.com> - 2021-04-01 06:11 -0700
Re: Create cookie from ID of <a> tag Thomas 'PointedEars' Lahn <PointedEars@web.de> - 2021-04-01 19:34 +0200
Re: Create cookie from ID of <a> tag The Natural Philosopher <tnp@invalid.invalid> - 2021-03-26 17:10 +0000
Re: Create cookie from ID of <a> tag Daniele <webmaster@appliserver.com> - 2021-03-27 12:16 +0100
Re: Create cookie from ID of <a> tag The Natural Philosopher <tnp@invalid.invalid> - 2021-03-27 13:25 +0000
Re: Create cookie from ID of <a> tag "Mark-" <nospam@mapson.xyz> - 2021-03-31 13:26 +0000
Re: Create cookie from ID of <a> tag Daniele <webmaster@appliserver.com> - 2021-03-27 12:08 +0100
Re: Create cookie from ID of <a> tag Man From a city with name Viljandi <ya12983@mail.com> - 2021-03-28 06:26 -0700
csiph-web