【问题标题】:MultipartFilter in a non-Spring MVC application非 Spring MVC 应用程序中的 MultipartFilter
【发布时间】:2015-06-24 16:42:02
【问题描述】:

在 Tomcat 6 中的 Java servlet (2.5) 中,我们使用 Spring 和 Spring security 3,但没有使用 Spring MVC。我们尝试实现 CSRF 安全性,因此我们将_csrf 令牌添加到我们所有的表单中。对于文件上传,我们将org.springframework.web.multipart.support.MultipartFilter 添加到web.xml,并修复了commons-fileupload 依赖项。

我们可以看到请求被解析和包装,但是spring security也在再次包装请求,所以我们不能再访问多部分数据了,是吗?我尝试将请求对象转换为MultipartHttpServletRequest,但失败了。互联网上的所有示例都展示了如何访问 Spring MVC 控制器中的文件项。我在这里有点迷路了。

【问题讨论】:

  • 额外问题:我确定我们只使用 servlet2.5,为什么会有 HttpServlet3RequestFactory 存在!?
  • 你能发布你的web.xml吗?

标签: java spring servlet-filters multipartform-data


【解决方案1】:

所有这些包装器都从标准ServletRequestWrapper 接口扩展而来。直接投到它,通过getRequest()方法获取封装好的请求,然后测试一下。

如果它实际上返回另一个 ServletRequestWrapper 实现,您甚至可以循环执行。

public static <R extends ServletRequest> R unwrap(ServletRequest request, Class<R> type) {
    ServletRequest current = request;

    while (!type.isInstance(current) && current instanceof ServletRequestWrapper) {
        current = ((ServletRequestWrapper) current).getRequest();
    }

    return type.isInstance(current) ? type.cast(current) : null;
}

用法:

MultipartHttpServletRequest multipartRequest = unwrap(request, MultipartHttpServletRequest.class);
// ...

至于额外的问题:您的 web 应用程序的运行时类路径包含某处​​ Servlet 3.0+ API。如果这不是意图,那么它可能只是一个肮脏的运行时类路径。只需清理它以摆脱 Servlet 3.0+ 库。 webapp 的运行时类路径覆盖的文件夹是 a.o. WAR 的/WEB-INF/lib、服务器的/lib 和JRE 的/lib

【讨论】:

  • 太好了,行得通!谢谢。我想我找到了为什么存在 servlet 3.0... 我的开发机器使用的是 Tomcat 7,它的 lib 文件夹中有 Servlet 3.0 API。
  • 不客气。如果 Spring 在 web.xml 中检查 version 会更好。
【解决方案2】:

虽然我喜欢 BalusC 更好地解决它的方式(使用 while 循环与递归),但我认为值得一提

import org.springframework.web.util.WebUtils;
...
WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);

做同样的事情,但只是使用递归,但在一个受良好支持的 Lib-Class 中:)

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 2015-10-27
    • 2023-03-16
    • 2014-06-26
    • 2012-09-30
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2011-01-17
    相关资源
    最近更新 更多