事实上,一个 HTTP 请求只能被解析一次。如果您需要解析它两次,客户端不会第二次发送它。您的问题表明,由于某种原因,PrimeFaces 文件上传过滤器也在普通 JSP/Servlet 请求上调用,因此在普通 JSP/Servlet 有机会解析 JSF 供自己使用之前解析 JSF 的上传。这不应该发生。
您只需将 PrimeFaces 文件上传过滤器映射到 JSF 请求,而不是普通的 JSP/Servlet 请求。通常,您可以通过将其映射到FacesServlet
.
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
(the <servlet-name>
必须与中使用的值完全相同<servlet>
的定义FacesServlet
班级;这<filter-name>
显然与中使用的值完全相同<filter>
文件上传过滤器类的定义)
或者,如果由于某种不明显的原因在 JSF 页面中直接使用旧的 JSP/Servlet 文件上传方法,那么您需要将 PrimeFaces 文件上传过滤器映射到更具体的 URL 模式,仅覆盖包含 PrimeFaces 文件上传组件的页面。
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<url-pattern>/upload.xhtml</url-pattern>
</filter-mapping>
(如果您已映射FacesServlet
例如*.jsf
代替*.xhtml
,那么您显然应该将 URL 模式更改为/upload.jsf
)
请注意,您可以指定多个<url-pattern>
单个过滤器映射上的条目,这对于您有多个包含 PrimeFaces 文件上传组件的页面的情况非常有用。
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<url-pattern>/upload1.xhtml</url-pattern>
<url-pattern>/upload2.xhtml</url-pattern>
<url-pattern>/upload3.xhtml</url-pattern>
</filter-mapping>