JSESSIONID สร้างขึ้นภายใต้เงื่อนไขใด


276

เมื่อใด / เงื่อนไขใดเมื่อJSESSIONIDสร้างขึ้น?

ต่อโดเมนหรือไม่ ตัวอย่างเช่นหากฉันมีเซิร์ฟเวอร์แอป Tomcat และฉันปรับใช้เว็บแอปพลิเคชั่นหลายตัวแอปพลิเคชันจะJSESSIONIDถูกสร้างขึ้นตามบริบท (เว็บแอปพลิเคชัน) หรือจะแชร์ผ่านเว็บแอปพลิเคชันตราบใดที่โดเมนเดียวกัน

คำตอบ:


324

คุกกี้ JSESSIONID ถูกสร้าง / ส่งเมื่อสร้างเซสชัน เซสชันถูกสร้างขึ้นเมื่อมีการเรียกรหัสของคุณrequest.getSession()หรือrequest.getSession(true)เป็นครั้งแรก ถ้าคุณเพียงต้องการที่จะได้รับเซสชั่น แต่ไม่ได้สร้างมันถ้ามันไม่ได้อยู่ที่การใช้งานrequest.getSession(false)- nullนี้จะกลับคุณเซสชั่นหรือ ในกรณีนี้จะไม่มีการสร้างเซสชันใหม่และจะไม่ส่งคุกกี้ JSESSIONID (นี่หมายความว่าเซสชันนั้นไม่จำเป็นต้องสร้างตามคำขอครั้งแรก ... คุณและรหัสของคุณสามารถควบคุมได้เมื่อสร้างเซสชัน)

เซสชันเป็นบริบท:

ขอบเขตเซสชัน SRV.7.3

วัตถุ HttpSession ต้องถูกกำหนดขอบเขตที่ระดับแอปพลิเคชัน (หรือบริบทของเซิร์ฟเล็ต) กลไกพื้นฐานเช่นคุกกี้ที่ใช้ในการสร้างเซสชั่นสามารถเหมือนกันสำหรับบริบทที่แตกต่างกัน แต่วัตถุที่อ้างอิงรวมถึงคุณลักษณะในวัตถุนั้นจะต้องไม่ถูกใช้ร่วมกันระหว่างบริบทโดยภาชนะ

( ข้อมูลจำเพาะ Servlet 2.4 )

อัปเดต: การเรียกไปยังหน้า JSP ทุกครั้งจะสร้างเซสชันใหม่หากไม่มีเซสชัน สิ่งนี้สามารถปิดได้ด้วยsession='false'คำสั่งหน้าซึ่งตัวแปรเซสชันไม่สามารถใช้ได้ในหน้า JSP เลย


2
สร้างเซสชันไม่ได้โดยไม่มีการเรียกที่ชัดเจนที่จะรับ getSession? ในเรื่องที่เกี่ยวกับ "จะต้องไม่ถูกใช้ร่วมกันระหว่างบริบทโดยภาชนะ" WebSphere มีตัวเลือกในการประชุมร่วมกันซึ่งเป็นแรงจูงใจสำหรับคำถาม :)
joshjdevl

ไม่ใช่ถ้าคุณใช้เพียงแค่ Servlet API อาจมีส่วนขยายเฉพาะเซิร์ฟเวอร์ (เช่นการแชร์เซสชันของ Websphere ตามที่คุณชี้)
Peter Štibraný

ฉันเชื่อว่าไฟล์ context.xml ของคุณสามารถควบคุมการสร้างเซสชันอัตโนมัติหากแท็ก <Context> ของคุณมีแอตทริบิวต์ของคุกกี้เช่น <Context cookies = "false">
BT

ตอนนี้ฉันได้รับความนิยมมากมายบนตัวกรองของฉันเพื่อสร้างเซสชันและดูเหมือนว่าจะเกิดขึ้นหลังจากการเข้าชมครั้งที่สอง (ไม่ใช่การรีเฟรชหน้าสอง) การสร้างนี้เรียกว่าความสนใจของฉัน "เซสชันไม่จำเป็นต้องสร้างตามคำขอแรก .. " มันเกี่ยวข้องหรือไม่ คุณยกตัวอย่างได้ไหมว่าทำไมสิ่งนี้ถึงไม่สร้างขึ้นเมื่อมีการร้องขอครั้งแรก? ขอบคุณ!
jpganz18

@ jpganz18: ถ้าคุณเพียงแค่โทรrequest.getSession()หรือrequest.getSession(true)จากนั้นคุณจะได้รับเซสชั่นที่มีอยู่หรือใหม่ อย่างไรก็ตามหากรหัสของคุณเรียกใช้แสดงว่าrequest.getSession(false)คุณได้รับเซสชันหรือ null ที่มีอยู่หากไม่มีเซสชันอยู่
ปีเตอร์ibrtibraný

49

นี่คือข้อมูลเกี่ยวกับJSESSIONIDคุกกี้อีกหนึ่งแหล่งที่มา:

ฉันเพิ่งดีบักโค้ด Java บางตัวที่รันบนเซิร์ฟเวอร์ Tomcat ฉันไม่ได้โทรไปrequest.getSession()ที่ใด ๆ อย่างชัดเจนในรหัสของฉัน แต่ฉันสังเกตเห็นว่าJSESSIONIDคุกกี้ยังคงถูกตั้งค่า

ในที่สุดฉันก็ดูรหัส Java ที่สร้างขึ้นที่สอดคล้องกับ JSP ในไดเรกทอรีงานภายใต้ Tomcat

ปรากฏว่าไม่ว่าคุณจะชอบหรือไม่ถ้าคุณเรียกใช้ JSP จาก servlet JSESSIONIDจะถูกสร้างขึ้น!

เพิ่ม: ฉันเพิ่งพบว่าโดยการเพิ่มคำสั่ง JSP ต่อไปนี้:

<%@ page session="false" %>

คุณสามารถปิดใช้งานการตั้งค่าJSESSIONIDโดย JSP


3
กล่าวอีกนัยหนึ่ง: ค่าเริ่มต้นสำหรับแอตทริบิวต์เซสชันของหน้าเว็บคือ "true" กรณีใดบ้างที่อาจไม่คาดคิด
David Balažic

ฉันใช้ tomcat ด้วยและฉันไม่ได้ใช้ jsp เลย แต่มีการสร้างคุกกี้เซสชัน มีความคิดใดที่จะป้องกันมันในสถานการณ์เช่นนี้?
ClassyPimp

23

การแก้ไข: กรุณาให้คะแนนคำตอบของ Peter Štibraný - มันถูกต้องและสมบูรณ์กว่า!

"JSESSIONID" เป็นรหัสเฉพาะของเซสชัน http - ดู Javadoc ที่นี่ ที่นั่นคุณจะพบประโยคต่อไปนี้

ข้อมูลเซสชันถูกกำหนดขอบเขตเฉพาะกับเว็บแอปพลิเคชันปัจจุบัน (ServletContext) ดังนั้นข้อมูลที่จัดเก็บในบริบทหนึ่งจะไม่ปรากฏในอีกบริบท

ดังนั้นเมื่อคุณเข้าชมไซต์เป็นครั้งแรกเซสชันใหม่จะถูกสร้างและเชื่อมโยงกับ SevletContext หากคุณปรับใช้หลายแอปพลิเคชันเซสชันจะไม่ถูกแชร์

นอกจากนี้คุณยังสามารถทำให้เซสชันปัจจุบันใช้ไม่ได้ดังนั้นจึงสร้างเซสชันใหม่ เช่นเมื่อเปลี่ยนจาก http เป็น https (หลังเข้าสู่ระบบ) เป็นความคิดที่ดีมากในการสร้างเซสชันใหม่

หวังว่านี่จะตอบคำถามของคุณ


1
คำอธิบายที่ชัดเจนเกี่ยวกับขอบเขตเซสชัน
user3123690

@Mo ลิงก์เสีย
Timofey

8

ระวังหากหน้าเว็บของคุณรวมถึง. jsp หรือ. jspf อื่น ๆ ! หากคุณไม่ได้ตั้งค่า

<%@ page session="false" %>

สำหรับพวกเขาเช่นกันหน้าหลักจะสิ้นสุดการเริ่มเซสชันใหม่และตั้งค่าคุกกี้ JSESSIONID

สำหรับหน้า. jspf โดยเฉพาะสิ่งนี้จะเกิดขึ้นหากคุณกำหนดค่า web.xml ด้วยตัวอย่างข้อมูล:

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

เพื่อเปิดใช้งาน scriptlets ภายในพวกเขา


คุณหมายถึง set page session = false ในแฟรกเมนต์ทั้งหมดที่รวมอยู่ (.jsp และ. jspf) และไม่รวมไว้ใน jsp หลักที่รวมตัวอย่างที่เหลือ?
Ommadawn

2

สำหรับลิงก์ที่สร้างใน JSP พร้อมแท็กที่กำหนดเองฉันต้องใช้

<%@ page session="false" %>

ใน JSP

และ

request.getSession().invalidate();

ในแอ็คชัน Struts

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.