繁体   English   中英

非 Spring MVC 应用程序中的 MultipartFilter

[英]MultipartFilter in a non-Spring MVC application

在 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也在再次包装请求,所以我们不能再访问multipart数据了,是吗? 我尝试将请求对象转换为MultipartHttpServletRequest但失败了。 互联网上的所有示例都展示了如何访问 Spring MVC 控制器中的文件项。 我有点迷失在这里。包装纸相互缠绕

所有这些包装器都从标准的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);
// ...

至于额外的问题:您的 webapp 的运行时类路径包含 Servlet 3.0+ API 的某个地方。 如果这不是本意,那么它可能只是一个肮脏的运行时类路径。 只需清理它即可摆脱 Servlet 3.0+ 库。 webapp 的运行时类路径所覆盖的文件夹是 ao WAR 的/WEB-INF/lib 、服务器的/lib和 JRE 的/lib

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM