2012-08-06 3 views
1

JSF2 백업 빈 (또는 서블릿)에서 사용자 정의 Tomcat 밸브에 의해 설정된 값을 검색하려고합니다. 이를 수행하는 방법을 알 수 없으며 Google을 사용하여 예제를 찾을 수 없습니다.WebApp Retrieve 데이터 세트를 Tomcat 밸브로 어떻게 할 수 있습니까?

배경 : JSF2 웹 앱에서 각 사용자에게 시간대 속성을 추가해야합니다. 이것을 구현하는 가장 쉬운 방법은 각 사용자가 적절한 시간대를 선택할 수 있도록 사용자 프로필 페이지에 시간대 드롭 다운을 추가하는 것입니다. 그러나 bit of JavaScript in the browser은 자동으로 시간대를 계산할 수 있기 때문에 자동화가 가능합니다.

그래서 나는 웹 응용 프로그램은 로그인시 캡처 할 수 있습니다이 값을 공급하고 내 톰캣 로그인 페이지에 새 매개 변수를 넣었습니다. Tomcat 폼 인증 메커니즘은 (j_security_check에 대한 HTTP POST를 통해) 로그인 페이지를 처리합니다. 이것을 잡기 위해 Java EE Servlet Filter를 구현했지만 Tomcat의 로그인 메커니즘이 필터를 우회하므로이 코드는 j_security_check에 대한 POST를 결코 볼 수 없습니다.

이제 Tomcat 밸브를 구현했으며 j_security_check에 대한 POST를 성공적으로 수행 할 수 있습니다. 코드에서 시간대 값을 추출하여 넣습니다 ... 어디에서?

나는 (TOMCAT_HOME/lib에 배치 할 수있다) 밸브 내 일반 JSF2 코드에 다른 클래스 로더를 가지고 있음을 이해합니다. 이는 JSF2 코드에서 밸브의 정적 멤버에 액세스 할 수 없음을 의미합니다.

그래서 표준 톰캣 밸브의 소스 코드에서 영감을

, 나는 밸브 내에서 이것을 시도했다 : 내 JSF2 콩 관리에

final org.apache.catalina.Session session = request.getSessionInternal(true); 
session.setNote("com.conexa.timezoneOffset", timezoneOffset); 

그러나, 나는이 org.apache에 대한 참조를 얻을 수 없습니다입니다 . 카탈로니아 세션.

이 코드는 나를 org.apache.catalina.Session 얻을하지 않는 유형 StandardSessionFacade의 개체를 반환합니다. ..

FacesContext.getCurrentInstance() getExternalContext()하는 getSession (FALSE); 디버그 모드에서 실행

, 나는 org.apache.catalina.Session을 찾을 수있었습니다,하지만 '노트'필드는 실제로 비어 있습니다.

는 또한 Tomcat이 (아마도 Session Fixation Protection 관련) 이후 새로운 세션을 생성 한 후 로그인을위한 하나 개의 세션을 사용할 수 있다고 생각합니다. 이것이 사실이라면 문제는 더 복잡해질 것이라고 생각합니다.

톰캣 전문가는 멋진 아이디어가 있습니까? 평범한 서블릿에 대한 해결책은 또한 내가 그것을 적응시킬 수있을 것이기 때문에 받아 들여질 것이다.

답변

3

좋아, 잡았어! JSF2 코드에서

final HttpSession session = request.getSession(true); 
session.setAttribute("timezoneOffset", timezoneOffset); 

: 밸브 코드에서

JSF 코드

final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
final String timezoneOffsetStr = "" + externalContext.getSessionMap().get("timezoneOffset"); 
+0

이 갖는'javax.servlet' 수입은 종종보다 더 간단 있다는 것을 --more JSF- 표시 같은 것을 달성하는 방법. 그리고 실제로, 당신은'externalContext.getSessionMap(). get ("timezoneOffset")'에 의해 그것을 얻을 수도 있습니다. 그건 그렇고,'getSession (false)'를 사용하면'null'을 검사하지 않는 다음 행에 잠재적 인'NullPointerException'을 생성하게됩니다. – BalusC

+0

고맙습니다. 코드를 업데이트했습니다. – Adam

관련 문제