Při vývoji webových aplikací a jejich provozování ve webovém kontejneru tomcat jste se již jistě setkali s tím, že si tomcat občas do odkazů přidává session id. Jde o techniku zvanou url rewriting, alternativu pro použití cookies. URL má pak tvar např. takovýto:
http://localhost:8080/test/index.html;jsessionid=AE74ACB5FB0589AEF5F210601CF37785
Zajímavé je, že ačkoliv máte cookies povolené, přesto se můžete s touto formou přenosu informace o session v aplikaci setkat.

Proč tomuto tak je, se můžete dočíst v mnoha konferencích, zde uvádím citaci z http://tomcat.apache.org/lists.html


On the first request, Tomcat has no way to know whether cookies are enabled or not, so it sends the session id both ways (in a cookie and with encoded urls). After that, if the session id comes back in as a cookie, it stops rewriting.

If Tomcat is still rewriting URLs after the first request, that means it didn’t see the cookie, which means either your client didn’t send it, or there is some proxy or server in between that swallowed it.

K tomuto problému jsme se dostali nedávno, při relaunchi jedné komerční aplikace. Tam občas při přihlašování vyskakovala java.lang.IllegalArgumentException v tomto kousku kódu:


if (! (Boolean)session.getAttribute("j_logoutPageCookieSet")) {
session.setAttribute("j_logoutPageCookieSet",Boolean.TRUE);
String address = (String)session.getAttribute("j_logoutPage");
Cookie cookie = new Cookie("j_logoutPage", address);
response.addCookie(cookie);
}

Pro ty, jenž znají perfektně specifikaci cookies není toto žádná novinka, avšak ti z vás, kteří nevidí na první pohled, v čem by mohl být problém, vězte, že zádrhel spočívá v pokusu uložit nesprávný formát řetězce address do cookies. Středník je v cookies brán jako oddělovač jednotlivých částí cookie (viz. RFC 2109), tudíž použití středníku může v některých případech způsobit výše popsané problémy.

Pokud máte také nepříjemné zkušenosti s použitím cookies, či znátě nějaký trik týkající se této oblasti, budu rád, když se o ně podělíte v diskuzi.