【问题标题】:Primefaces Upload Filter interferes Servlet UploadPrimefaces 上传过滤器干扰 Servlet 上传
【发布时间】:2020-05-26 15:40:58
【问题描述】:

我有以下问题: 在我的带有 Primefaces UI 的 Spring Boot Web 应用程序中,我想在后端上传资产。我还想通过 webservlet 使 web 服务可用于上传资产。

Primefaces 上传过滤器似乎干扰了网络服务。

我的 ServletContextInitializer 类:

   @Configuration
   public class Initializer implements ServletContextInitializer {
      @Bean
      public FilterRegistrationBean FileUploadFilter() {
         FilterRegistrationBean registration = new FilterRegistrationBean();
         registration.setFilter(new org.primefaces.webapp.filter.FileUploadFilter());
         registration.setName("PrimeFaces FileUpload Filter");
         registration.addUrlPatterns("/*");
         registration.setDispatcherTypes(DispatcherType.FORWARD, DispatcherType.REQUEST);
         registration.setAsyncSupported(true);
         return registration;
      }
   }

我的 Servlet 类如下所示:

@WebServlet(name = "InsertAsset", urlPatterns = {"/InsertAsset"})
@MultipartConfig
public class InsertAsset extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        System.out.println(servletContext.getMajorVersion() + "." + servletContext.getMinorVersion());

        List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName()) && part.getSize() > 0).collect(Collectors.toList());

        for (Part filePart : fileParts) {
            String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); 
            InputStream fileContent = filePart.getInputStream();

        }
    }
}

当 Primefaces 上传过滤器处于活动状态时,webservlet 不起作用(fileparts 为空)。 Primefaces UI 的上传处理程序正常工作。 当我取消注释 Primefaces 上传过滤器时,webservlet 工作正常并且文件部分被填充。但是 Primefaces UI 上传处理程序根本不会被调用。

这里有什么问题?我必须重新配置上传过滤器吗?

感谢您的帮助。

【问题讨论】:

  • "我需要重新配置上传过滤器吗?"你试过了吗?似乎是一件简单的事情......但是是的,我会这么认为。
  • 我刚刚向过滤器添加了另一个订单。但这并没有改变。
  • uhhh... 有一个过滤器和一个 servlet。过滤器总是在 servlet 之前运行,与顺序无关。更改过滤器路径使其与 servlet 的 url 模式不匹配更合乎逻辑。但也请查看stackoverflow.com/questions/8875818/… 以获取提示

标签: spring-boot servlets file-upload primefaces


【解决方案1】:

实际上,您的过滤器“监听”范围太广。 FilterRegistrationBean 可以选择设置 servlet 名称。

注册可以与 URL 模式和/或 servlet 相关联(通过名称或通过 ServletRegistrationBeans。当没有指定 URL 模式或 servlet 时,过滤器将与“/*”相关联。如果没有,则推断过滤器名称指定。

试试这个,而不是 url 模式,就像在 this answer 中所做的那样

<servlet-name>facesServlet</servlet>

【讨论】:

  • 感谢您引导我走向正确的方向。我必须为 servlet 注册第二个过滤器(org.springframework.web.multipart.support.MultipartFilter)。我为此过滤器使用了我的 servlet 的 urlpattern,并将顺序更改为低于 Primefaces 上传过滤器的顺序。现在它起作用了。 github.com/rawdog71/Clownfish/blob/master/clownfish/src/main/…
猜你喜欢
  • 2023-04-05
  • 2012-12-16
  • 2021-11-16
  • 2012-01-05
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多