Trong những điều kiện nào thì một JSESSIONID được tạo ra?


276

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

Có phải mỗi tên miền? Chẳng hạn, nếu tôi có máy chủ ứng dụng Tomcat và tôi triển khai nhiều ứng dụng web, thì sẽ JSESSIONIDtạo ra một bối cảnh khác nhau cho mỗi bối cảnh (ứng dụng web) hay nó được chia sẻ trên các ứng dụng web miễn là chúng cùng tên miền?

Câu trả lời:


324

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 lấy phiên, nhưng không tạo phiê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 được tạo theo yêu cầu đầu tiên ... bạn và mã của bạn được kiểm soát khi phiên được tạo)

Phiên là theo từng bối cảnh:

Phạm vi phiên SRV.7.3

Các đối tượng httpSession phải nằm trong phạm vi ứng dụng (hoặc bối cảnh servlet). Cơ chế cơ bản, chẳng hạn như cookie được sử dụng để thiết lập phiên, có thể giống nhau cho các bối 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 đó, không bao giờ được chia sẻ giữa các bối cảnh bởi container.

( Đặc tả Servlet 2.4 )

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


2
Không thể tạo một phiên làm việc với một cuộc 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 container", websphere có một tùy chọn để chia sẻ các phiên, đó là động lực cho câu hỏi :)
joshjdevl

Không, nếu bạn chỉ sử dụng API Servlet. 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).
Peter tibraný

Tôi tin rằng tệp ngữ cảnh của bạn có thể kiểm soát việc tạo phiên tự động nếu thẻ <Ngữ cảnh> của bạn chứa thuộc tính cookie, ví dụ: <Ngữ cảnh cookie = "false">
BT

Ngay bây giờ tôi đang nhận được nhiều lượt truy cập trên bộ lọc của mình để tạo phiên và dường như chỉ sau lần truy cập thứ hai (không phải làm mới trang thứ hai), nó được gọi là "phiên không nhất thiết phải được tạo theo yêu cầu đầu tiên .." là nó liên quan? bạn có thể đưa ra một ví dụ tại sao điều này không nhất thiết phải được tạo ra ở yêu cầu đầu tiên? Cảm ơn!
jpganz18

@ jpganz18: Nếu bạn chỉ cần gọi request.getSession()hoặc request.getSession(true), thì bạn sẽ có phiên hiện tại hoặc phiên mới. Tuy nhiên, nếu mã của bạn gọi request.getSession(false), thì bạn nhận được phiên hiện tại hoặc null, nếu không có phiên nào tồn tại.
Peter tibraný

49

Dưới đây là một số thông tin về một nguồn JSESSIONIDcookie nữa:

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

Cuối cùng tôi đã xem mã Java được tạo tương ứng với một tệp 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 tệp JSP từ một servlet, JSESSIONIDsẽ được tạo!

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

<%@ page session="false" %>

bạn có thể vô hiệu hóa cài đặt của JSESSIONIDmột JSP.


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

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

23

ĐÚNG: Hãy bỏ phiếu cho câu trả lời của Peter Štibraný - nó chính xác và đầy đủ hơn!

"JSESSIONID" là id duy nhất của phiên http - xem javadoc tại đây . Ở đó, bạn sẽ tìm thấy câu sau đây

Thông tin phiên chỉ nằm trong phạm vi ứ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 bối cảnh khác.

Vì vậy, khi bạn lần đầu tiên truy cập một trang web, một phiên mới sẽ được tạo và ràng buộc với SevletContext. Nếu bạn triển khai nhiều ứng dụng, phiên 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 một 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 trả lời câu hỏi của bạn.


1
Giải thích rõ ràng về phạm vi phiên.
dùng3123690

@Mo liên kết bị hỏng
Timofey

8

Coi chừng nếu trang của bạn bao gồm .jsp hoặc .jspf (đoạn) khác! Nếu bạn không đặt

<%@ page session="false" %>

trên chúng cũng vậy, trang mẹ sẽ kết thúc bắt đầu một phiên mới và thiết lập cookie JSESSIONID.

Đối với các trang .jspf nói riêng, điều này xảy ra nếu bạn định cấu hình tệp web.xml của mình với đoạn mã như vậy:

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

để kích hoạt scriptlets bên trong chúng.


Bạn có nghĩa là đặt phiên trang = false trong tất cả các đoạn được bao gồm (.jsp và .jspf) và không bao gồm nó trong jsp chính bao gồm phần còn lại của đoạn trích?
Ommadawn

2

Đối với các liên kết được tạo trong một tệp 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 hành động Struts

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.