2013-08-18 5 views
3

Tomcat은 Java EE 표준에 따라 두 가지 방법으로 기존 세션 ID를 지정하도록 요청할 수 있습니다. 2) "경로 매개 변수"(일반 매개 변수가 아니라 경로 매개 변수의 형식은 http://host/path/file.ext;jsessionid=xxx?a=b&c=d...입니다. ";"및 쿼리 문자열이 경로 매개 변수 다음에 시작한다는 사실에주의하십시오). 내가 원하는 것은 "?"다음에 오는 쿼리 문자열에있는 REGIAL 매개 변수로 요청의 세션 ID를 전달하는 것입니다 (예 : http://host/path/file.ext?jsessionid=xxx).요청에서 세션 ID를 가져 오는 Tomcat의 메서드를 재정의합니다.

요청이 가로 채고 컨테이너가 세션 ID (예 : 필터 또는 서블릿)를 결정하는 방식을 변경하는 시점까지는 너무 늦었습니다. 변경하려는 동작은 클라이언트의 요청을 처리하는 초기 단계입니다. 내가 피하고 싶은 것은 Coyote 또는 Tomcat 코드를 변경하고 Tomcat을 직접 재 빌드하는 것입니다. 내가 원하는 것은 해당 코드를 덮어 쓰고 Tomcat이 코드를 사용하여 요청 된 세션 ID를 결정하는 것입니다. 그건 불가능한 것 같지만 틀렸으면 좋겠어요.

이 방법으로 세션 ID를 가져 오는 것이 비표준임을 알고 있습니다. 쿠키 나 경로 매개 변수를 사용하는 것이 세션 상태를 추적하는 훌륭한 방법이라는 것을 알고 있습니다. 나는 실제 쿼리 문자열에 세션 ID를 두는 것이 자체의 잠재적 인 문제점을 제시한다는 것을 알고 있습니다. 어쨌든 그것을해야합니다.

Tomcat 7을 실행 중입니다. btw.

+0

그렇게할만한 이유가있는 것 같습니다. 그것을 우리와 함께 나눌 수 있습니까? –

+0

@JB Nizet - 물론입니다. 우리는 사용자에게 "쿠키를 사용하지 않습니다."라고 말합니다. Google의 앱은 개인 정보 보호와 관련이 있으며 좋은 일이라고 말할 수 있습니다. 이제는 세션 쿠키가 수명이 긴 쿠키와 다른 점이 있지만 많은 사용자에게 이러한 차이가 있습니다. 그래서 이것은 사생활 침해에 관한 것입니다. 어쨌든, 이것은 URL을 통해 세션을 지속해야 함을 의미합니다 (하이재킹에 대한 모든 종류의 보호, obv). 그러나 "경로 매개 변수"형식은 사용자가 저장할 수있는 콘텐츠를 제공 할 때 일부 브라우저를 혼동합니다 (일부 브라우저는 파일 이름에 jsessionid를 사용합니다). –

+0

@Will Hartung - 감사합니다. 그리고 네, 맞습니다. 수명주기 초기에 params를 파싱하는 것에주의해야합니다. 그 이유 때문에'getParameter()'를 사용하지 않을 것이다; 쿼리 문자열에서 구문 분석했습니다. (여러분도 지적했듯이, 내 세션 ID 매개 변수는 POST 될 수 없지만 POST URL에는 여전히 쿼리 문자열이 추가 될 수 있기 때문에 괜찮습니다.) –

답변

1

가장 쉬운 방법은 소스에서 Tomcat을 빌드하고 CoyoteAdapter.java 클래스를 해킹하는 것입니다.

이것은이 코드가있는 곳이지만 요청 파이프 라인의이 부분을 가로 채기 위해 약간의 코드를 삽입 할 수있는 코드의 쉽게 확장 할 수있는 부분이 아닙니다.

CoyoteAdapter를 "제자리에서"해킹하는 것이 아니라 자신 만의 고유 한 커넥터를 구현할 수는 있지만 결국에는 업데이트 유지 등의 유지 관리 문제가 있습니다.

일반적으로 요청 매개 변수는 요청할 때까지 구문 분석을하지 않으므로주의해야합니다. 일반적으로 실제 사용자 코드까지는 수행되지 않습니다 (이전에 파이프 라인에서 처리 된 것으로 생각하지 않습니다. 사용자 코드를 치는).

GET의 경우 매개 변수 구문 분석이 요청 헤더에서 끝나지 만 POST의 경우 내용을 기반으로하기 때문에 중요합니다. 매개 변수 요청을 요청하면 POST 또는 GET인지 여부에 상관없이 자동으로 "올바른 작업 수행"을 수행합니다.

이것은 POST에서 요청 매개 변수를 요청하면 파이프 라인이 사용자 응용 프로그램 코드 앞에 입력 스트림 (헤더 다음에 요청 페이로드를 가리 키기 시작 함)을 소비 함을 의미합니다. 유스 케이스에 따라 다르지만 일부 응용 프로그램은 원시 스트림을 원하기 때문에 원시 URL 자체에 대한 작업보다는 내장 된 요청 매개 변수 논리를 사용하여 신중해야합니다.

또한 간단한 필터로이 문제를 해결할 수 있으며 HttpServletRequest를 기본 Tomcat 구현 (현재 이름을 알지 못하는 사람)으로 캐스팅 한 다음 "setSessionID"코드를 호출 할 수 있습니다 그. Dunno가 처리주기에서 너무 늦었 든 그렇지 않든간에 그것은 잘 될 수 있습니다.

이렇게 할 수 있습니다. 오히려 간단하게 보이지만 확장을 위해 실제로 규정 된 방법은 아닙니다. 공식적인 방법은 tomcat 커넥터를 복제하여 사용자 자신의 CoyoteAdapter 버전을 호출하고 server.xml에서이를 구성하는 것입니다. 그러나 자신 만의 바람둥이 버전을 기꺼이 유지하고자한다면 CoyoteAdapter를 직접 해킹하는 것이 훨씬 쉽습니다.