2013-09-06 2 views
0

그냥 내가 request.getSession()이 (가) 세션을 가져오고 있거나 세션을 만들고 있습니까?

request.getSession()

나에게 현재 세션을 제공합니다,

Under what conditions is a JSESSIONID created?

지금까지 내가하는 인상에서 오전 통해 사라 (를 작성하지 기부)를 기반으로 boolean이 해당 방법으로 전달되었습니다. 여기까지 시원하게 보입니다.

이제 난 당신의 코드가 처음으로 request.getSession() 또는는 invalidate()를 호출 할 때

세션이 생성되는 것을 읽었다. 내가 servlets 내 어떤에서 request.getSession()를 호출, 그리고 아니에요 경우

그래서, 그 서블릿은 session의 필요가 없습니다

1

), (50 정도) 일부 정적 HTML 페이지를 제공하기 위해 만들어진 컨테이너와 클라이언트 사이에?

2) 컨테이너가 클라이언트를 감지하는 방법 (html 페이지 제공)이 없다면 session id 이외의 헤더에 숨겨진 정보가 있습니까?

+0

어디서 마지막 견적을 읽었습니까? – Beryllium

+0

@Beryllium 당신이 말하는 것은 무엇입니까? –

+0

"코드가 호출 될 때 세션이 생성되었습니다 ..." – Beryllium

답변

0

1) 컨테이너와 클라이언트간에 세션이 필요하지 않습니까?

---> html 페이지 인 경우 필요하지 않습니다. JavaDocs HTML 페이지, 당신은 만들 세션이 필요하지 않습니다.

2) 컨테이너가 세션 ID 이외의 헤더에 숨겨진 정보를 감지하는 방법 (HTML 페이지 제공)이 없다면?

----> URL이며 URL을 html 페이지와 매핑하거나 페이지를 공개 액세스로 유지하면됩니다. 여기서 요청이 히트되면 tomcat은 요청 페이지를 응답으로 작성하여 요청을 처리 할 스레드를 생성합니다.

HTTP Request header

1

HttpSession 봐 항상 필요하지 않습니다를 가져 가라. 서블릿이 "상태 비 저장 (stateless)"상태이고 HTTP 요청의 정보가 요청을 수행하기에 충분하다면이 경우입니다.

request.getSession()을 호출하지 않는 서블릿이있는 경우 HttpSession이 작성되지 않습니다.

일반적으로 서블릿이 동일한 클라이언트의 요청이 여러 개인지 검색해야하는 경우 HttpSession이 필요합니다. 예를 들어 세션 속성에서 대화식 상태 (예 : 장바구니 등)를 관리 할 수 ​​있습니다.


예 : 만 텍스트/일반 문자열을 반환하는 서블릿에 telnet : 굵은의 텍스트를 입력 할되었다 (그건 HTTP 요청)

$ 텔넷 로컬 호스트 8080
127.0.0.1 시도 중 ...
localhost.localdomain에 연결되었습니다.
이스케이프 문자는 '^]'입니다.
GET/XXX/textplainservlet/HTTP/1.1
호스트 : 로컬 호스트 : 8080

HTTP/1.1 200 OK
서버 : 아파치 - 코요테/1.1
콘텐츠 유형 : 텍스트/일반; 캐릭터 세트 =-8859-1 ISO
콘텐츠 길이 : 13
날짜 : 금, 그리니치 표준시 12시 11분 10초

안녕하세요 2013 9월 6일, 세계

이 경우에는 영역이 만들어지지 않습니다.


예 :

GET /xxx/hello.jsp HTTP/1.1
호스트 : 로컬 호스트 : 8080

정적 HTML 콘텐츠를 제외한 아무 것도 반환하지 않습니다 간단한 JSP

HTTP/1.1 200 OK
서버 : Apache-Coyote/1.1
X-Powered-By : JSP/2. 2
쿠키 설정 : JSESSIONID = n0cOaZFUvlXSvX7hNEfcNzHP.undefined; 경로 =/NK-eapp 핑-60-JPA
의 Content-Type : text/html과; 문자셋 = ISO-8859-1
콘텐츠 길이 : 49
날짜 : 2013년 9월 6일 (금) 12시 11분 58초 JSP로 명시 적으로 request.getSession()를 호출하지 않는 경우에도, GMT는

[... HTML 문서 ...]이 경우

이하는 세션 만들어지고 쿠키가 설정됩니다 !

따라서 나는 HttpSessionListener을 첨부했으며 실제로 세션은 암시 적으로 만들어집니다.

org.apache.catalina.session.StandardSession.tellNew (StandardSession.java:374)
org.apache.catalina.session.StandardSession.setId (StandardSession.java : 그 리스너에서 나는 스택 추적을 덤프 344)
org.apache.catalina.session.ManagerBase.createSession (ManagerBase.java:506)
org.apache.catalina.session.StandardManager.createSession (StandardManager.java:297)
org.apache.catalina .connector.Request.doGetSession (Request.java:2665)
org.apache.catalina.connector.Request.getSession (Request.java:2375),210 org.apache.catalina.connector.RequestFacade.getSession (RequestFacade.java:841)
org.apache.catalina.connector.RequestFacade.getSession (RequestFacade.java:852)
org.apache.jasper.runtime. PageContextImpl._initialize (PageContextImpl.자바 : 146)
org.apache.jasper.runtime.PageContextImpl.initialize (PageContextImpl.java:124)
org.apache.jasper.runtime.JspFactoryImpl.internalGetPageContext (JspFactoryImpl.java:106)
org.apache. jasper.runtime.JspFactoryImpl.getPageContext (JspFactoryImpl.java:62)
org.apache.jsp.hello_jsp._jspService (hello_jsp.java:45는)

이 테스트는

보스 7. 사용하여 실행 된

채널 세션이 생성되었는지 여부를 확인하려면 방금 HttpSessionListener을 사용하여 다시 테스트하십시오.

@WebListener 
public class MyHttpSessionListener implements HttpSessionListener { 
    private final static Logger log = Logger 
      .getLogger(MyHttpSessionListener.class.getName()); 

    public void sessionCreated(HttpSessionEvent e) { 
     // Possibly create a stack trace here, and dump it 
     log.info("Session created: " + e.getSession().getId() + ", timeout " 
       + e.getSession().getMaxInactiveInterval()); 
    } 

    public void sessionDestroyed(HttpSessionEvent e) { 
     log.info("Session destroyed: " + e.getSession().getId()); 
    } 
}