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 관련) 이후 새로운 세션을 생성 한 후 로그인을위한 하나 개의 세션을 사용할 수 있다고 생각합니다. 이것이 사실이라면 문제는 더 복잡해질 것이라고 생각합니다.
톰캣 전문가는 멋진 아이디어가 있습니까? 평범한 서블릿에 대한 해결책은 또한 내가 그것을 적응시킬 수있을 것이기 때문에 받아 들여질 것이다.
이 갖는'javax.servlet' 수입은 종종보다 더 간단 있다는 것을 --more JSF- 표시 같은 것을 달성하는 방법. 그리고 실제로, 당신은'externalContext.getSessionMap(). get ("timezoneOffset")'에 의해 그것을 얻을 수도 있습니다. 그건 그렇고,'getSession (false)'를 사용하면'null'을 검사하지 않는 다음 행에 잠재적 인'NullPointerException'을 생성하게됩니다. – BalusC
고맙습니다. 코드를 업데이트했습니다. – Adam