2011-07-24 20 views
10

Tôi nhận thấy rằng lần đầu tiên người dùng truy cập trang web của tôi, các URL do Wicket tạo có chứa jsessionid, thay vì dựa vào cookie để biết thông tin về phiên.Tại sao jsessionid xuất hiện trong URL Wicket khi cookie được bật?

Cookie không được đặt thành công và nếu người dùng chỉ cần tải lại trang, thì jsessionid không còn được nối vào URL nữa. Bạn có thể kiểm tra điều này ở đây: pixlshare.com. Di chuột qua bất kỳ liên kết hình ảnh nào sẽ hiển thị URL có số jsessionid; tải lại trang và jsessionids sẽ bị xóa.

Từ kinh nghiệm trước đó với Wicket SEO page Tôi biết cách xóa jsessionid để ẩn nó khỏi bot, nhưng việc sử dụng kỹ thuật này cho người dùng thông thường có vẻ như là hack. Nó cũng sẽ phá vỡ các trang web cho những người hoang tưởng, đủ để có cookies bị vô hiệu hóa.

Điều này xảy ra sau khi di chuyển gần đây đến Tomcat từ Glassfish, mặc dù tôi không thể nói chắc chắn rằng đó là nguyên nhân. Ngoài ra, tôi đang sử dụng mod_proxy của Apache trước Tomcat.

Trả lời

18

Đây là những gì sẽ xảy ra: khách hàng yêu cầu một trang cho lần đầu tiên, gửi không có cookie tại tất cả:

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

Máy chủ không biết gì về khả năng của khách hàng dựa trên yêu cầu này, đặc biệt là cho dù nó hỗ trợ cookie hay không. Do đó, để an toàn hơn, nó sẽ gửi cả cookie và JSESSIONID mã hóa trong các URL:

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

Nói cách khác container servlet phòng thủ gắn JSESSIONID để mỗi URL, chỉ trong trường hợp khách hàng không hỗ trợ cookie.

Vậy tại sao số JSESSIONID biến mất theo yêu cầu thứ hai? Bởi vì bây giờ khách hàng gửi cookie trong yêu cầu HTTP và máy chủ biết rằng máy khách xử lý chúng. Điều đó đang được nói, JSESSIONID không còn cần thiết nữa.

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

Mặt khác nếu khách hàng không hỗ trợ cookie, máy chủ sẽ tiếp tục viết lại URL.

Đây không phải là vấn đề về Wicket, đây là tính năng Tomcat.


BTW (từ trang web của bạn JavaScript):

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

gì f ... ake?

+0

Nhiều trình duyệt sẽ cung cấp "C: \ fakepath \ your_file.jpg" làm tên tệp được báo cáo khi bạn tải lên. JS chỉ xóa phần đó ra sao cho phần cuối cùng của tên tệp được hiển thị trước khi tải lên. Mục đích là để hiển thị cho người dùng tên tệp (không có đường dẫn) để họ có thể thấy rằng họ đang tải lên FOO.jpg chứ không phải BAR.jpg. Không có gì bất chính. :-) –

+0

Tôi nhận được lý do tại sao Tomcat đang làm điều này, nhưng tại sao tôi không có vấn đề này với Glassfish? –

+0

Ah, tôi lấy lại bình luận của mình. Tôi vừa kiểm tra một trang web khác đang chạy trên Glassfish và sau khi xóa cookie của tôi cho trang web đó, tôi đã nhận được các jsessionids. –