当前位置: 首页 > 面试题库 >

如何在Tomcat上运行的servlet过滤器中使用HttpServletRequest#getParts()?

龚彬
2023-03-14
问题内容

我想在我的JSF应用程序中上传文件。我正在使用FilterHttpServletRequestWrapper访问上载文件。

 public MultipartRequestWrapper(HttpServletRequest request) {
    super(request);
    System.out.println("Created multipart wrapper....");
    try {
        System.out.println("Looping parts"+getParts().size());

        for (Part p : getParts()) {
            System.out.println(String.format("Part name: %1$s, contentType : %2$s", p.getName(), p.getContentType()));
            for(String header : p.getHeaderNames()){
                System.out.println("Header name : " + header + ", value : " + p.getHeader(header));
            }
            byte[] b = new byte[(int) p.getSize()];
            p.getInputStream().read(b);
            params.put(p.getName(), new String[]{new String(b)});
        }
    } catch (IOException ex) {
        ex.printStackTrace();
        Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ServletException ex) {
         ex.printStackTrace();
        Logger.getLogger(MultipartRequestWrapper.class.getName()).log(Level.SEVERE, null, ex);
    }

但是,getParts()返回一个空集合。如何multipart/form-data在Tomcat7.0.8中的Servlet过滤器中启用解析?


问题答案:

为了获得HttpServletRequest#getParts()在一个工作Filter在Tomcat中,您需要设置allowCasualMultipartParsing="true"在webapp的<Context>元素Webapp/META-INF/context.xmlTomcat/conf/server.xml

<Context ... allowCasualMultipartParsing="true">

因为根据Servlet3.0规范,该HttpServletRequest#getParts()属性只能在HttpServlet带有@MultipartConfig注释的内使用。另请参阅<Context>元素的文档:

allowCasualMultipartParsing

设置为trueTomcat是否应multipart/form- data调用HttpServletRequest.getPart*或时自动解析请求主体HttpServletRequest.getParameter*,即使目标servlet没有标注@MultipartConfig注释(有关详细信息,请参见Servlet
Specification
3.0,第3.2节)。请注意,除了设置以外,任何其他设置false都会导致Tomcat的行为在技术上不符合规范。默认值为false

具体问题 无关 ,以下绝对不正确:

byte[] b = new byte[(int) p.getSize()];
p.getInputStream().read(b);
params.put(p.getName(), new String[]{new String(b)});

首先,您不遵守客户端指定的字符编码-如果有的话。其次,这对于二进制文件将失败。



 类似资料:
  • 这可能起作用,但由于某种原因,数据基本上是空的。我猜原因是因为过滤器不起作用。 我不太清楚如何包装Servlet过滤器,因为它们与Jersey ContainerRequestFilter期望不同的输入和输出。JerseyConfig中的以下实现似乎什么也不做,因为日志没有指示筛选器正在注册,而且在调试模式下不能中断这些文件中的行。

  • 问题内容: 我正在尝试找到一种方法,可将请求从过滤器重定向到登录页面,但我不知道如何从servlet重定向。我搜索了,但发现的是方法。我在过滤器的响应对象上找不到此方法。是什么原因 我该如何解决? 问题答案: 在Filter中,响应是而不是。因此将强制转换为。 如果使用上下文路径: 也不要忘记在最后打电话。

  • 我试图将CORS过滤器添加到SpringWeb应用程序中,但该过滤器未被执行。我在这里遵循了相关步骤:https://spring.io/guides/gs/rest-service-cors/无济于事。我没有用Spring靴。我正在3.0 servlet规范容器中使用Spring的WebApplicationInitializer引导我的应用程序。 我的应用程序中的其他一切都在工作:配置类、控制

  • 问题内容: 我定义了一个,并且具有带有Spring注释的Java类。 我想将Bean 放入我的,因此尝试了以下操作: 但是它总是返回。我怎样才能得到一个Spring bean? 问题答案: 尝试: 你的bean在应用程序上下文中的名称/标识在哪里。甚至更好: 还可以看看GenericFilterBean及其子类。

  • 有没有办法以。x容器?我需要在提供服务的同时提供静态资源,因此需要使用或仅在根据Javadoc作为过滤器运行时工作 该属性仅在Jersey servlet容器配置为作为javax运行时适用。servlet。筛选,否则将忽略此属性。 我想彻底摆脱 并且在我的定制类中拥有所有内容 不幸的是,官方留档(https://jersey.java.net/documentation/latest/deploy

  • 我使用Atmosphere 1.0.15在Tomcat下处理推送通知,几年来一直运行良好。最近,我在Tomcat中添加了一个简单的过滤器作为测试,它(目前)只记录传入的URL并继续。问题在于,Tomcat似乎根本不会对my Atmosphere处理的任何servlet路径调用过滤器,但对任何其他servlet路径调用过滤器都很好。 以下是我网站的相关部分。xml: 这就是我的氛围。xml: 奇怪的