어떤 조건에서 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.