2011-11-17 3 views
11

보기 매개 변수를 정의하는 JSF2 XHTML 페이지가있어 북마크 가능한 URL을 가질 수 있습니다. XHTML의 페이지 매개 변수를 포함JSF2 리다이렉트 includeViewParams를 사용하면 사용자가 텍스트 필드로 해석되는 EL 표현식을 입력 할 수 있습니다.

<h:form id="some-id"> 
    <h:inputText value="#{nbsearchpage.searchName}" /> 
    <h:commandButton value="search" action="#{nbsearchpage.search}" /> 
</h:form> 

그리고 마지막으로, 액션 메소드 검색 : 같은 페이지에서

<f:metadata> 
    <f:viewParam name="searchName" value="#{nbsearchpage.searchName}" /> 
    <!-- More view parameters omitted here for brevity --> 
    <f:event listener="#{nbsearchpage.searchPreRender}" type="javax.faces.event.PreRenderViewEvent" /> 
</f:metadata> 

을, 나는 텍스트 필드와 사용자가 searchName을 변경할 수있는 버튼이 있습니다() 같은 페이지에 nbsearchpage 콩 수익률하지만 매개 변수를 포함 :

멋진 URL을 사용자에게 제공
?faces-redirect=true&amp;includeViewParams=true 

. 사용자가 검색 필드에 "IBM"을 입력하면 URL은

으로 리디렉션됩니다. 완벽하게 작동합니다. 그러나 이제 사용자는 searchName 텍스트 필드에 EL 표현식을 입력 할 수 있으며 EL 표현식이 평가됩니다. 예 : 사용자가 입력 할 때 "#은 {2 + 2}"텍스트 필드에서 URL은

?searchName=4 

로 리디렉션되고 이것은 내가 보안으로 인해 EL 발현를 입력 할 수 있도록 허용, 우리가 일을하지 않아야 생각입니다 원인. Glassfish 3.1.1을 사용하고 있습니다.

이 자동 EL 해결을 방지하는 방법에 대한 아이디어가 있으십니까? JSF2의 뷰 매개 변수 개념과 리디렉션과 관련된 근본적인 결함이 있다고 생각합니다. 나는 리디렉션에서 살아남지 못하는 뷰 범위와 동일한 문제를 겪었고,이를 위해 자체 범위를 만들어야했습니다. (나는 플래시 스코프를 사용할 수 있었다).

+1

Mojarra 2.1.2에서 이것을 재현 할 수 있습니다. 세션 특성에 액세스하고 임의의 메서드를 호출 할 수 있기 때문에 심각한 보안 결함입니다. –

답변

5

이 내용은 Mojarra 2.1.4에서 재현 할 수 있습니다. 이것은 확실히 바람직하지 않습니다. 나는 Mojarra 녀석에게 issue 2247으로보고했다 (가능한 경우 투표하십시오). 그런데 MyFaces 2.1.3도 같은 문제를 노출합니다.

근본 원인이 JSF 구현 특정 유틸리티 클래스에있는 한이 특정 문제에 대한 간단한 해결 방법은 없습니다. /WEB-INF/classes에 쉽게 수정 된 복사본을 가질 수 있지만 구현 독립적 인 경우 ViewHandlerImpl 또는 ExternalContextImpl을 완전히 다시 구현하고 사용자 지정 형식으로 제공해야하지만 많은 작업이 필요합니다.

<form> 
    <h:inputText id="searchName" value="#{nbsearchpage.searchName}" /> 
    <input type="submit" value="search" /> 
</form> 

을 사전 대신보기 이벤트 리스너를 렌더링의 액션 메소드를 수행하지만

, 이미 <f:viewParam>를 사용하고, 당신은 단지 <h:commandButton> 대신 <form> 대신 <h:form><input type="submit">를 사용할 수 있습니다. <h:form>은 POST 전용이므로 GET 양식을 JSF에서 사용하는 더 적절한 방법이기도합니다. 구체적인 문제에


관련없는 :

나는 리디렉션을 생존하지 않는 뷰 범위와 같은 문제가 있고,이를 위해 나는 자신의 범위를 만들어야했습니다.

생존 리디렉션 결코 뷰 범위의 의도되었다. 뷰 범위는 동일한 뷰 (특히 Ajax와 컨텐트의 조건부 재 렌더링)와 상호 작용하는 한 계속 존재합니다. 기본적으로 대화 범위를 찾고 있습니다. CDI의 @ConversationScoped 또는 MyFaces CODI을 보았을 것입니다.

1

이 문제는 Mojarra 버전 2.0.7, 2.1.5, 2.1.6의 경우 MyFaces Core 버전 2.0.11, 2.1.5 및 JAVASERVERFACES-2247의 경우 MYFACES-3405에서 해결되었습니다.

업데이트 된 버전 만 사용하십시오.