tomcat 7 에서 session 실현

tomcat 7 에서 session 실현
세 션 은 단지 하나의 개념 일 뿐 입 니 다. "Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user."
클 라 이언 트 브 라 우 저 와 이 SessionId 의 정 보 를 어떻게 교환 하 는 지, 많은 책 들 이 세 가지 방식 을 언급 했다. 쿠키, URL 재 작성 과 폼 숨 기기 
  • Cookie - Based Session 이 라면 Sessionid 는 브 라 우 저가 닫 히 면 효력 을 잃 는 쿠키 에 연 결 된 다음 클 라 이언 트 브 라 우 저 는 이 쿠키 로 세 션 을 표시 합 니 다.이것들 은 모두 웹 용기 가 우 리 를 대신 해서 완성 한 것 임 을 주의 하 세 요.
  • URL 재 작성 이 라면 모든 요청 문자열 뒤에 추 가 됩 니 다.jsessionid = XXXXX XXX 라 는 표 시 는 세 션 을 표시 하 는 데 사 용 됩 니 다.... 와 같다http://niutv.com.cn/admin/login;jsessionid=EE0B4EAD02DA7B6328A106D06F177D16。

  • tomcat 에서 session 의 실현
    org. apache. coyote 패키지 의 Coyote 프레임 워 크
    Coyote 는 Tomcat 의 HTTP Connector 프레임 워 크 로 밑 에 있 는 socket 을 처리 하고 http 요청, 응답 등 바이트 흐름 차원 의 것 을 Request 와 Response 두 종류 로 봉 하여 용기 에 사용 하도록 합 니 다.또한, 우리 가 작성 한 servlet 이 ServletRequest 를 얻 을 수 있 도록 Tomcat 은 Facade 모드 를 사용 하여 바 텀, 저급한 Request 를 ServletRequest 로 포장 합 니 다 (이 과정 은 보통 Wrapper 용기 1 급 에서 발생 합 니 다).
    따라서 Coyote 는 본질 적 으로 tomcat 의 용기 에 바 텀 socket 연결 데이터 에 대한 패 키 징 을 제공 하여 Request 류 형식 으로 용기 가 끝까지 의 데 이 터 를 접근 할 수 있 도록 합 니 다.그리고 연결 탱크, 스 레 드 탱크 등 socket 과 직접 접촉 하 는 일 에 대해 tomcat 는 org. apache. tomcat. util. net 가방 의 류 에 맡 겼 습 니 다.Tomcat 은 기본적으로 두 개의 Http 프로 토 콜 을 지원 합 니 다: HTTP 1.1 과 AJP.
    CoyoteAdapter 역할: Adapter 는 Tomcat 커 넥 터 와 용기 Container 를 연결 합 니 다. 이 구현 클래스 는 CoyoteAdapter 가 주로 요청 을 봉인 하고 Request 와 Response 대상 을 구성 하 며 요청 을 Container 즉 Servlet 용기 에 전달 합 니 다.
    Request 와 Response
    Request 는 Coyote 프레임 워 크 의 핵심 클래스 로 거의 모든 connector 와 용기 에 사 용 됩 니 다.
    Request 클래스 는 기본 http 바이트 흐름 에 대한 패 키 징 을 실현 합 니 다. http 는 본질 적 으로 네트워크 에서 온 바이트 흐름 이 고 논리 적 으로 http 프로 토 콜 에 따라 머리 와 몸 으로 나 뉘 는데 그 중에서 머리 에 많은 필드 (MIME 필드 포함) 가 있 기 때 문 입 니 다.Request 의 역할 은 이 바이트 들 을 대응 하 는 필드 로 봉 하고 처리 효율 이 가장 좋 은 것 이다.따라서 Request 의 대부분 방법 은 필드 의 get 방법 (set 방법 이 많 지 않 습 니 다. 대부분의 필드 는 바 꿀 수 없 기 때 문 입 니 다) 이 고 Response 류 는 정반 대 입 니 다.휴지통, inputbuffer 등 용기 에 사용 할 수 있 는 방법 도 제공 된다.
    Coyote Adapter 와 같은 session 쿠키 와 관련 된 방법:
    protected void parseSessionCookiesId(Request req, Request request)
    Parse session id in URL.
    protected void parseSessionSslId(Request request)
    Look for SSL session ID if required.org.apache.tomcat.util.http.ServerCookie

    server - side cookie representation. 서버 쪽 쿠키 의 표시 라 는 뜻 입 니 다.
    //////////////////////////////////////////////////////////
    = = = = = = = = 위 에서 알 아 보기 = = = = = = = = = = = = = =
    getSession 때 requestSessionId 를 통 해 찾 은 session 입 니 다. requestSessionId 값 은 어떻게 됩 니까?이것 은 분명히 Session 구현 메커니즘 의 쿠키 나 URL 재 작성 을 통 해 설 정 된 것 입 니 다.
    org. apache. catalina. connector. CoyoteAdapter 클래스 의 방법 parseSessionCookiesId (org. apache. coyote. Request req, Request request) 의 원본 코드:
    (코드 는 이 층 만 보 입 니 다) 
    // Parse session id from cookies
    // A collection of cookies - reusable and tuned for server side performance.
    Cookies serverCookies = req.getCookies();
    //
    int count = serverCookies.getCookieCount();
    if (count <= 0) {
        return;
    }
    String sessionCookieName = SessionConfig.getSessionCookieName(context);
    for (int i = 0; i < count; i++) {
        //Server-side cookie representation.        cookie   
        ServerCookie scookie = serverCookies.getCookie(i);
        if (scookie.getName().equals(sessionCookieName)) {
            // Override anything requested in the URL
            if (!request.isRequestedSessionIdFromCookie()) {
                // Accept only the first session id cookie
                convertMB(scookie.getValue());
                request.setRequestedSessionId
                        (scookie.getValue().toString());
                request.setRequestedSessionCookie(true);
                request.setRequestedSessionURL(false);
                if (log.isDebugEnabled()) {
                    log.debug(" Requested cookie session id is " +
                            request.getRequestedSessionId());
                }
            } else {
                if (!request.isRequestedSessionIdValid()) {
                    // Replace the session id until one is valid
                    convertMB(scookie.getValue());
                    request.setRequestedSessionId
                            (scookie.getValue().toString());
                }
            }
        }
    }

    위의 코드 에서 request SessionId 는 쿠키 나 재 작성 한 URL 에서 얻 은 것 으로 분석 할 수 있 습 니 다.
    request.setRequestedSessionId(scookie.getValue().toString());

    tomcat 7 의 기본 sessionId 이름 입 니 다.
    public class SessionConfig {
        private static final String DEFAULT_SESSION_COOKIE_NAME = "JSESSIONID";
        private static final String DEFAULT_SESSION_PARAMETER_NAME = "jsessionid";
    
        /**
         * Determine the name to use for the session cookie for the provided
         * context.
         * @param context
         */
        public static String getSessionCookieName(Context context) {
    
            String result = getConfiguredSessionCookieName(context);
    
            if (result == null) {
                result = DEFAULT_SESSION_COOKIE_NAME;
            }
    
            return result;
        }
    
        /**
         * Determine the name to use for the session cookie for the provided
         * context.
         * @param context
         */
        public static String getSessionUriParamName(Context context) {
    
            String result = getConfiguredSessionCookieName(context);
    
            if (result == null) {
                result = DEFAULT_SESSION_PARAMETER_NAME;
            }
    
            return result;
        }
    
    
        private static String getConfiguredSessionCookieName(Context context) {
    
            // Priority is:
            // 1. Cookie name defined in context
            // 2. Cookie name configured for app
            // 3. Default defined by spec
            if (context != null) {
                String cookieName = context.getSessionCookieName();
                if (cookieName != null && cookieName.length() > 0) {
                    return cookieName;
                }
    
                SessionCookieConfig scc =
                    context.getServletContext().getSessionCookieConfig();
                cookieName = scc.getName();
                if (cookieName != null && cookieName.length() > 0) {
                    return cookieName;
                }
            }
    
            return null;
        }
    
    
        private SessionConfig() {
            // Utility class. Hide default constructor.
        }
    }

    한 마디 로 하면 tomcat 는 먼저 requestSessionId 를 받 아야 합 니 다. 이 requestSessionId 는 클 라 이언 트 브 라 우 저 에서 제출 한 쿠키 나 재 작성 한 Url 에서 얻 은 것 입 니 다. 
    ======================END======================

    좋은 웹페이지 즐겨찾기