2009-02-27 26 views
230

Khi nào/các điều kiện khi tạo JSESSIOINID là gì?Theo JSESSIONID được tạo điều kiện nào?

Trên mỗi miền? Ví dụ, nếu tôi có một máy chủ ứng dụng Tomcat, và tôi triển khai nhiều ứng dụng web, sẽ tạo ra một JSESSIONID khác nhau cho mỗi ngữ cảnh (ứng dụng web), hoặc nó được chia sẻ trên các ứng dụng web miễn là chúng là cùng một tên miền?

Trả lời

267

Cookie JSESSIONID được tạo/gửi khi phiên được tạo. Phiên được tạo khi mã của bạn gọi request.getSession() hoặc request.getSession(true) lần đầu tiên. Nếu bạn chỉ muốn nhận phiên, nhưng không tạo nó nếu nó không tồn tại, hãy sử dụng request.getSession(false) - điều này sẽ trả lại cho bạn một phiên hoặc null. Trong trường hợp này, phiên mới không được tạo và cookie JSESSIONID không được gửi. (Điều này cũng có nghĩa là phiên không nhất thiết phải tạo ra theo yêu cầu đầu tiên ... bạn và mã của bạn đang kiểm soát khi phiên được tạo ra)

Sessions là mỗi bối cảnh:

SRV.7.3 Phạm vi phiên

HttpCác đối tượng phải được đặt tại ứng dụng (hoặc ngữ cảnh servlet) . Cơ chế cơ bản, chẳng hạn là cookie được sử dụng để thiết lập phiên , có thể giống nhau cho các ngữ cảnh khác nhau, nhưng đối tượng được tham chiếu, bao gồm các thuộc tính trong đối tượng này.

(Servlet 2.4 specification)

Cập nhật: Mỗi cuộc gọi đến trang JSP ngầm tạo ra một phiên mới nếu không có phiên nào. Điều này có thể được tắt với chỉ thị trang session='false', trong đó biến phiên trường hợp không có sẵn trên trang JSP.

+1

phiên không thể được tạo ra với một lời gọi rõ ràng đến getSession? liên quan đến "không bao giờ được chia sẻ giữa các bối cảnh bởi vùng chứa", websphere có tùy chọn chia sẻ phiên, đó là động lực cho câu hỏi :) – joshjdevl

+0

Không nếu bạn chỉ sử dụng API Servlet. Tuy nhiên, có thể có các tiện ích mở rộng dành riêng cho máy chủ (như chia sẻ phiên của Websphere khi bạn chỉ ra). –

+0

Tôi tin rằng tệp context.xml của bạn có thể kiểm soát việc tạo phiên tự động nếu thẻ của bạn chứa thuộc tính cookie, ví dụ:

16

SỬA ĐỔI: Vui lòng bỏ phiếu cho câu trả lời của Peter Štibraný - câu trả lời chính xác và đầy đủ hơn!

"JSESSIONID" là id duy nhất của phiên http - see the javadoc here. Trong javadoc, bạn sẽ tìm thấy câu sau: "Thông tin phiên chỉ được phạm vi cho ứng dụng web hiện tại (ServletContext), vì vậy thông tin được lưu trữ trong một ngữ cảnh sẽ không được hiển thị trực tiếp trong một ngữ cảnh khác".

Vì vậy, khi lần đầu tiên bạn truy cập một trang web, một phiên mới sẽ được tạo và liên kết với SevletContext. Nếu bạn triển khai nhiều ứng dụng, phiên sẽ không được chia sẻ.

Bạn cũng có thể làm mất hiệu lực phiên hiện tại và do đó tạo phiên mới. ví dụ. khi chuyển từ http sang https (sau khi đăng nhập), bạn nên tạo một phiên mới.

Hy vọng, điều này sẽ trả lời câu hỏi của bạn.

+1

Giải thích rõ về phạm vi phiên. – user3123690

+0

@Một liên kết bị hỏng – Tim

37

Dưới đây là một số thông tin về thêm một nguồn cung cấp cookie JSESSIONID:

Tôi chỉ gỡ lỗi một số mã Java chạy trên một máy chủ tomcat. Tôi đã không gọi request.getSession() một cách rõ ràng ở bất kỳ nơi nào trong mã của mình nhưng tôi nhận thấy rằng cookie JSESSIONID vẫn đang được đặt.

Cuối cùng tôi đã xem xét mã Java được tạo tương ứng với JSP trong thư mục công việc trong Tomcat.

Dường như, dù bạn có thích hay không, nếu bạn gọi một JSP từ một servlet, JSESSIONID sẽ được tạo!

Added: Tôi chỉ thấy rằng bằng cách thêm các chỉ thị JSP sau:

<%@ page session="false" %> 

bạn có thể vô hiệu hóa các thiết lập của JSESSIONID bởi một JSP.

+3

Nói cách khác: giá trị mặc định cho thuộc tính phiên trang là "true". Điều này có thể bất ngờ trong một số trường hợp (nhiều?). –

+0

Tôi cũng trên tomcat, và tôi không sử dụng jsp chút nào, nhưng cookie phiên được tạo ra. Bất kỳ ý tưởng làm thế nào để ngăn chặn nó trong tình huống này? – ClassyPimp

1

Đối với liên kết được tạo ra trong một JSP với các thẻ tùy chỉnh, tôi đã phải sử dụng

<%@ page session="false" %> 

trong JSP

request.getSession().invalidate(); 

trong Struts hành động

7

Hãy coi chừng nếu trang của bạn bao gồm các tệp .jsp hoặc .jspf khác (fragment)! Nếu bạn không đặt

<%@ page session="false" %> 

trên trang đó, trang gốc sẽ kết thúc bắt đầu phiên mới và đặt cookie JSESSIONID.

Đối .jspf trang nói riêng, điều này sẽ xảy ra nếu bạn đã cấu hình web.xml của bạn với một đoạn ví dụ:

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jspf</url-pattern> 
    </jsp-property-group> 
</jsp-config> 

để cho phép scriptlets bên trong chúng.

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