어떤 조건에서 JSESSIONID가 생성됩니까?


276

JSESSIONID만들 때의 조건은 언제 / 무엇 입니까?

도메인 당입니까? 예를 들어 Tomcat 앱 서버가 있고 여러 웹 응용 프로그램을 배포하는 JSESSIONID경우 컨텍스트 (웹 응용 프로그램)마다 다른 내용 이 만들어 지거나 동일한 도메인 인 한 웹 응용 프로그램간에 공유됩니까?

답변:


324

세션이 생성 될 때 JSESSIONID 쿠키가 생성 / 전송됩니다. 세션은 코드 호출시 request.getSession()또는 request.getSession(true)처음 생성됩니다 . 세션을 가져 request.getSession(false)오고 싶지만 존재하지 않는 경우 세션을 만들지 않으려면 사용하십시오 null. 세션 또는를 반환합니다 . 이 경우 새 세션이 작성되지 않고 JSESSIONID 쿠키가 전송되지 않습니다. (이것은 또한 첫 번째 요청시 세션이 반드시 생성되는 것은 아니라는 것을 의미합니다 ... 세션이 생성 되면 사용자와 코드가 제어 됩니다 )

세션은 상황에 따라 다릅니다.

SRV.7.3 세션 범위

HttpSession 오브젝트는 애플리케이션 (또는 서블릿 컨텍스트) 레벨에서 범위를 지정해야합니다. 세션을 설정하는 데 사용되는 쿠키와 같은 기본 메커니즘은 다른 컨텍스트에서 동일 할 수 있지만 해당 오브젝트의 속성을 포함하여 참조 된 오브젝트는 컨테이너가 컨텍스트간에 공유하지 않아야합니다.

( 서블릿 2.4 사양 )

업데이트 : JSP 페이지에 대한 모든 호출은 아직 세션이없는 경우 암시 적으로 새 세션을 만듭니다. session='false'JSP 페이지에서 세션 변수를 전혀 사용할 수없는 경우 페이지 지시문 으로이를 해제 할 수 있습니다 .


2
getSession에 대한 명시 적 호출없이 세션을 작성할 수 없습니까? "컨테이너가 컨텍스트간에 공유하지 않아야 함"과 관련하여 websphere에는 세션을 공유 할 수있는 옵션이 있습니다. 이는 세션에 대한 동기입니다. :)
joshjdevl

서블릿 API 만 사용하는 경우에는 아닙니다. 서버 별 확장 (예 : Websphere의 세션 공유 등)이있을 수 있습니다.
Peter Štibraný

<Context> 태그에 쿠키 속성이 포함 된 경우 context.xml 파일이 자동 세션 생성을 제어 할 수 있다고 생각합니다 (예 : <Context cookies = "false">
BT

지금 내 필터에서 많은 조회수를 가져 와서 세션을 작성하는 중이며 두 번째 조회 (두 번째 페이지 새로 고침이 아님)가 작성된 후에 만 ​​표시되는 것처럼 보입니다. 이는 "세션이 첫 번째 요청시 반드시 작성되지는 않습니다."입니다. 관련? 첫 번째 요청에서 이것이 반드시 생성되지 않는 이유를 예를 들어 주시겠습니까? 감사!
jpganz18

@ jpganz18 : 당신은 단순히 호출하는 경우 request.getSession()또는 request.getSession(true), 당신이 얻을하거나 기존 또는 새로운 세션. 그러나 코드가을 호출 request.getSession(false)하면 기존 세션이 있거나 세션이 없으면 null을 얻습니다.
피터 Štibraný

49

하나 이상의 JSESSIONID쿠키 소스에 대한 정보는 다음과 같습니다 .

Tomcat 서버에서 실행되는 Java 코드를 디버깅하고있었습니다. request.getSession()내 코드의 어느 곳에서나 명시 적으로 호출하지 않았지만 JSESSIONID쿠키가 여전히 설정되어 있음을 알았습니다 .

마지막으로 Tomcat의 작업 디렉토리에서 JSP에 해당하는 생성 된 Java 코드를 살펴 보았습니다.

서블릿에서 JSP를 호출하면 원하는지 여부에 관계없이 JSESSIONID생성됩니다!

추가 : 다음 JSP 지시문을 추가하여 방금 발견했습니다.

<%@ page session="false" %>

JSESSIONIDJSP 에 의한 설정을 비활성화 할 수 있습니다 .


3
즉, 페이지 세션 속성의 기본값은 "true"입니다. 어떤 경우에는 (다수?) 예상치 못한 결과가있을 수 있습니다.
David Balažic

나는 또한 바람둥이에 있으며, jsp를 전혀 사용하지 않지만 세션 쿠키는 어쨌든 생성됩니다. 이 상황에서 그것을 방지하는 방법에 대한 아이디어가 있습니까?
ClassyPimp

23

정정 : Peter Štibraný의 답변에 투표하십시오-더 정확하고 완전합니다!

"JSESSIONID"는 http 세션의 고유 ID입니다 . 여기에서 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>

내부에 스크립틀릿을 활성화합니다.


포함 된 모든 조각 (.jsp 및 .jspf)에서 page session = false를 설정하고 나머지 스 니펫을 포함하는 기본 jsp에 포함시키지 않으시겠습니까?
Ommadawn

2

사용자 정의 태그를 사용하여 JSP에서 생성 된 링크의 경우

<%@ page session="false" %>

JSP에서

request.getSession().invalidate();

Struts 액션에서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.