2009-01-12 37 views
12

Tôi hiện đang chạy một ứng dụng với các thuộc tính sau:Hỗ trợ phiên Without Cookies trong Tomcat

  • dựa trên nền Java với mùa xuân và Acegi
  • Chạy trên Tomcat 5

tôi cần có khả năng để hỗ trợ phiên người dùng mà không cần cookie. Làm ơn ai đó có thể chỉ cho tôi đúng hướng.

Cảm ơn bạn.

+1

nên không làm việc này ra khỏi hộp trên Tomcat? các servlet container nên thiết lập một tham số yêu cầu JSESSIONID về việc sử dụng đầu tiên của phiên, một d nếu khách hàng không gửi lại một phản ứng báo hiệu rằng nó chấp nhận cookie, container được cho là contiue để sử dụng tham số này ... Tôi nghĩ. –

Trả lời

18

Câu trả lời hoàn chỉnh cho câu hỏi này là sự kết hợp của tất cả các câu trả lời, vì vậy tôi sẽ tóm tắt:

  1. Không cần phải thiết lập các tập tin cookie = "false" trong tập tin context.xml . Chức năng lý tưởng là cho tomcat sử dụng nhận dạng phiên dựa trên url của nó, sẽ được sử dụng theo mặc định nếu cookie không được người dùng hỗ trợ.

  2. Khi người dùng không bật cookie, tomcat sẽ xác định phiên theo thông số "JSESSIONID" từ url của yêu cầu. Một url vài mẫu như sau http://www.myurl.com;jsessionid=123456AFGT3 http://www.myurl.com;jsessionid=123456AFGT3?param1=value&param2=value2 Thông báo như thế nào id phiên không phải là một phần của chuỗi truy vấn url (đây là một tiêu chuẩn J2EE)

  3. Để đảm bảo các thông số jsessionid được nối vào tất cả các yêu cầu của bạn URL, bạn không thể có tham chiếu url đơn giản. Ví dụ, trong JSTL, bạn phải sử dụng < c: url>. Công cụ servlet sau đó sẽ tự động gắn thêm jsessionid vào url nếu nó là cần thiết. Dưới đây là một ví dụ:

    <% - điều này là xấu: -%> < a href = "page.html"> liên kết </a>

    <% - đây là tốt: - %> < a href = "< c: giá trị url = 'trang.html '/> "> liên kết </a>

+0

Cách để thực hiện nếu tôi đang sử dụng các cuộc gọi ajax? (liên kết không href) – maximus

0

Bạn có thể theo dõi theo địa chỉ IP, nhưng máy chủ proxy (và NAT?) Có thể làm hỏng bạn.

Bạn có thể buộc tất cả các URL phải có phiên làm tham số và tất cả biểu mẫu dưới dạng trường ẩn. Có thể một thẻ tùy chỉnh để tạo URL có thể trợ giúp ở đây, nhưng tôi đã không thực hiện nhiều công việc với thẻ taglib.

Bạn cần cân nhắc bảo mật - mọi người có thể gửi liên kết qua email tới người khác có id phiên trong đó, vì vậy bạn sẽ muốn kiểm tra địa chỉ IP cho từng quyền truy cập để kiểm tra xem địa chỉ có khớp với phiên không.

+0

Tôi khuyên bạn không nên theo dõi địa chỉ IP vì VPN. Câu trả lời này là cũ, vì vậy tôi sẽ không downvote nhưng tôi mạnh mẽ khuyên chống lại điều này cho người xem câu trả lời trong tương lai. – azdragon2

4

Xem http://tomcat.apache.org/tomcat-5.5-doc/config/context.html.

Trong một file META-INF/context.xml,

<?xml version='1.0' encoding='UTF-8'?> 
<Context path='/myApplicationContext' cookies='false'> 
    <!-- other settings --> 
</Context> 
+1

Điều này dường như gắn thêm JSESSIONID vào url trên yêu cầu đầu tiên của ứng dụng. Nhưng, làm thế nào để đảm bảo rằng nó được nối thêm vào các yêu cầu tiếp theo? –

0

Như matt b nhận xét này nên làm việc ra khỏi hộp (tomcat sẽ cố gắng cookies, và nếu điều đó không rơi trở lại trên mã hóa phiên làm việc trong url). Tuy nhiên, điều này sẽ không hoạt động nếu bạn tự tạo liên kết 'đơn giản' - luôn sử dụng phương thức như JSTL để tomcat có thể thêm thông số theo dõi vào tất cả các url.

0

Cách tốt nhất là sử dụng URL viết lại. Vì vậy, khi bạn sử dụng request.getSession(), các container sẽ gửi" Set-Cookie "tiêu đề cho session-id trong HTTP-phản ứng như cũng như session-id nối vào URL (nhưng bạn phải sử dụng response.encodeURL(session_info) cho url viết lại).

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException { 
    resp.setContentType("text/html"); 
    PrintWriter pw=resp.getWriter(); 
    HttpSession session=req.getSession(); 
    pw.println("<html><body>"); 
    pw.println("<a href=\""+resp.encodeURL("/session_info")+"\">Click</a>"); 
    pw.println("</body></html>"); 

} 
Các vấn đề liên quan