2011-07-24 18 views
10

Zauważyłem, że po raz pierwszy użytkownik odwiedza moją witrynę, generuje adresy URL zawierające numer jsessionid, zamiast polegać na pliku cookie dla informacji o sesji.Dlaczego jsessionid pojawia się w adresach URL tagów, gdy włączone są pliki cookie?

Plik cookie zostaje pomyślnie ustawiony, a jeśli użytkownik po prostu przeładuje stronę, numer jsessionid nie jest już dołączany do adresów URL. Możesz przetestować to tutaj: pixlshare.com. Najechanie na dowolny z linków graficznych wyświetli adres URL z numerem jsessionid; ponownie załaduj stronę, a jsessionids zostanie usunięte.

Z wcześniejszych doświadczeń z Wicket SEO page Wiem, jak usunąć jsessionid, aby ukryć go przed botami, ale stosowanie tej techniki dla zwykłych użytkowników wydaje się być hackem Złamie to również witrynę dla tych ludzi, którzy są na tyle paranoiczni, że wyłączą pliki cookie.

Dzieje się to po niedawnym przeprowadzce do Tomcat z Glassfish, choć nie mogę powiedzieć na pewno, że to jest przyczyną. Używam również mod_proxy Apache'a przed Tomcat.

Odpowiedz

18

Oto co się dzieje: klient zażąda stronę po raz pierwszy, wysyłając żadnych ciasteczek w ogóle:

$ curl -v http://pixlshare.com/upload 

Serwer ma nic o możliwości klienta na podstawie tego wniosku nie wiadomo, w szczególności czy obsługuje ciasteczka lub nie. Stąd być bardzo bezpieczne, wysyła zarówno cookies i JSESSIONID zakodowany w adresie URL:

< Set-Cookie: JSESSIONID=25E7A6C27095CA1F560BCB2983BED17C; Path=/; HttpOnly 
... 
<a wicket:id="image1Link" href="gallery/OKfzVk;jsessionid=25E7A6C27095CA1F560BCB2983BED17C"> 

Innymi słowy kontener serwletów defensywnie dołącza JSESSIONID do każdego adresu URL, tylko w przypadku, gdy klient nie obsługuje plików cookie.

Dlaczego więc JSESSIONID znika przy drugim żądaniu? Ponieważ teraz klient wysyła plik cookie w żądaniu HTTP, a serwer wie, że klient je obsługuje. Biorąc to pod uwagę, JSESSIONID nie jest już potrzebna.

$ curl -v -b JSESSIONID=25E7A6C27095CA1F560BCB2983BED17C http://pixlshare.com/upload 
> Cookie: JSESSIONID=25E7A6C27095CA1F560BCB2983BED17C 
... 
<a wicket:id="image1Link" href="gallery/OKfzVk"> 

Z drugiej strony, jeśli klient nie obsługuje plików cookie, serwer będzie kontynuował przepisywanie adresów URL.

To nie jest wydarzenie Wicket, jest to funkcja Tomcat.


BTW (od swojej stronie JavaScript):

path = path.replace(/^C:\\fakepath\\/i, ''); 

jaka f ... ake?

+0

Wiele przeglądarek podaje "C: \ fakepath \ your_file.jpg" jako raportowaną nazwę pliku podczas przesyłania. JS właśnie je usuwa, aby ostatnia część nazwy pliku była wyświetlana przed przesłaniem. Celem jest pokazanie użytkownikom nazwy pliku (bez ścieżki), aby mogli zobaczyć, że przesyłają FOO.jpg, a nie BAR.jpg. Nic nikczemnego. :-) –

+0

Dowiedziałem się, dlaczego Tomcat to robi, ale dlaczego nie miałem tego problemu z Glassfish? –

+0

Ah, odbieram mój komentarz. Właśnie sprawdziłem inną stronę uruchomioną na Glassfish, a po wyczyszczeniu plików cookie dla tej strony, dostałem jsessionidy. –