2011-10-12 7 views
7

내 JSF 응용 프로그램에서 PrettyFaces를 사용하고 있습니다. 이 사이트는 일부 페이지에 액세스하기 위해 인증이 필요하므로 사용자가 로그인했는지 여부를 확인하는 수신기 (프리 렌더 뷰)를 사용하고 있습니다. 따라서 사용자가/foo (PrettyFaces 이전에 /foo.jsf)에 액세스하려고하면 리디렉션합니다 로그인하기.PrettyFaces로 원래 요청 URI 받기

그러나 초기 대상으로 리디렉션하고 싶습니다. 요청 매개 변수 "next"를 첨부하여 사용자를/login? next =/foo로 리디렉션합니다. 불행하게도, 내가 요청 개체에서 원래 requestURI를 얻을 수 없다, 다음 코드에서 URI 문자열 대신/APPNAME/foo는

ctx = FacesContext.getCurrentInstance().getExternalContext(); 
HttpServletRequest request = (HttpServletRequest) ctx.getRequest(); 
String uri = request.getRequestURI(); 

의 /appname/foo.jsf 된 원본을 검색 할 수있는 방법이 있나요 URI 경로?

답변

6

PrettyFaces는 RequestDispatcher#forward() 표지를 사용하여 예쁜 URL을 실제 URL로 전달합니다. 이 기술을 사용하여 원래 요청 URI는 RequestDispatcher#FORWARD_REQUEST_URI 키가있는 요청 속성으로 사용할 수 있습니다.

그래서,이 수행해야합니다

String originalURI = (String) externalContext.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 
// ... 
+0

고맙습니다. 실제로는 requestMap에 저장되지만 키 이름은 약간 다르며 문자열로 제공됩니다. 다음은 효과가있었습니다. 문자열 originalURI = (문자열) ctx.getRequestMap(). get ("javax.servlet.forward.request_uri"); – ustun

+0

어, 그 값은'RequestDispatcher # FORWARD_REQUEST_URI'와 같습니다. javadoc을 참조하십시오. http://download.oracle.com/javaee/6/api/constant-values.html#javax.servlet.RequestDispatcher.FORWARD_REQUEST_URI 값을 sysout 할 때 정확히 무엇을 얻었습니까? 또는 컴파일하지 않았습니까? (그 상수는 Servlet 2.5에서 소개되었습니다). – BalusC

+0

예, 누락 된 필드에 대해 불만을 나타내어 컴파일하지 않았습니다. 이상하게도, 나는 이미 Servlet 2.5 (종속성에 포함되어 있음)를 사용하고 있다고 생각했지만, 다른 이전 버전은 무시하고있을 수 있습니다. – ustun

3

사용이 코드를 원래의 요청 URL 얻을 :..

PrettyContext.getCurrentInstance() 대해 getRequestURL() toURL()를