msa*_*din 13 redirect el jsf-2 viewparams
我有一个定义视图参数的JSF2 XHTML页面,这允许一个具有可收藏的URL.XHTML页面包含以下参数:
<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>
Run Code Online (Sandbox Code Playgroud)
在同一页面上,我有一个文本字段和一个允许用户更改searchName的按钮:
<h:form id="some-id">
<h:inputText value="#{nbsearchpage.searchName}" />
<h:commandButton value="search" action="#{nbsearchpage.search}" />
</h:form>
Run Code Online (Sandbox Code Playgroud)
最后,nbsearchpage bean中的action方法search()返回同一页面,但包括参数:
?faces-redirect=true&includeViewParams=true
Run Code Online (Sandbox Code Playgroud)
它为用户提供了一个很好的URL.当用户在搜索字段中输入"IBM"时,URL将重定向到
?searchName=IBM
Run Code Online (Sandbox Code Playgroud)
它非常好用.但现在用户可以在searchName文本字段中输入EL表达式,并评估EL表达式.例如,当用户在文本字段中输入"#{2 + 2}"时,URL将被重定向到
?searchName=4
Run Code Online (Sandbox Code Playgroud)
这就是我认为我们不应该做的事情,允许用户出于安全原因输入EL表达式.我正在使用Glassfish 3.1.1.
有任何想法如何防止这种自动EL解析?我认为JSF2中的视图参数概念存在一个根本性的缺陷并且具有重定向功能?我遇到了与重定向无法生存的视图范围相同的问题,为此我必须创建一个自己的范围.(我本可以使用闪存范围).
我可以在Mojarra 2.1.4上重现这一点.这绝对是不可取的.我已经向Mojarra家伙报告了问题2247(如果可以,请投票支持).顺便说一句,MyFaces 2.1.3也暴露了同样的问题.
对于这个特定问题,没有简单的解决方法可以想到,因为根本原因是在JSF实现特定的实用程序类中.您可以轻松地在您的修改副本中进行修改/WEB-INF/classes,但要实现独立,您必须完全重新实现ViewHandlerImpl或者可能ExternalContextImpl并将其作为自定义提供,但这是很多工作.
然而,当你已经在使用<f:viewParam>,也可以只使用<form>替代<h:form>和<input type="submit">取代<h:commandButton>:
<form>
<h:inputText id="searchName" value="#{nbsearchpage.searchName}" />
<input type="submit" value="search" />
</form>
Run Code Online (Sandbox Code Playgroud)
而是在预渲染视图事件侦听器中执行操作方法.这也是在JSF中使用GET表单的更合适的方式,<h:form>仅适用于POST.
与具体问题无关:
我遇到了与重定向无法生存的视图范围相同的问题,为此我必须创建一个自己的范围.
幸存的重定向从未成为视图范围的意图.只要您与同一视图交互(特别是通过Ajax和有条件地重新呈现内容),视图范围就可以生存.你基本上是在寻找对话范围.您已经查看了CDI @ConversationScoped或MyFaces CODI.