java - 非 Spring MVC 应用程序中的 MultipartFilter

标签 java spring servlet-filters multipartform-data

在 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 但它失败了。 Internet 上的所有示例都显示了如何在 Spring MVC Controller 中访问文件项。我在这里有点迷路了。 Wrappers wrapping each other

最佳答案

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

至于奖励问题:您的网络应用程序的运行时类路径包含某处​​ Servlet 3.0+ API。如果这不是本意,那么它很可能只是一个肮脏的运行时类路径。只需清理它即可摆脱 Servlet 3.0+ 库。 webapp 的运行时类路径涵盖的文件夹是 a.o. WAR的/WEB-INF/lib,服务端的/lib,JRE的/lib

关于java - 非 Spring MVC 应用程序中的 MultipartFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31032320/

相关文章:

java - 使用 GridLayout - 如何设置 JPanel 大小?

java - Android:Fragment:为什么我只能在 onCreateView 方法中获取对 View 的引用?

javascript - 如何在jsp页面显示图片?

带有重音字符的 Java 属性文件

java - 通过过滤器在 Servlet 中设置身份验证 header

java - 如何用 spring 拦截器替换 servlet 过滤器中的代码?

java - 如何在 Kotlin 的 Map 实例上使用 `filter`?

通过堆栈跟踪的 Java 反射

java - Hibernate删除用户

java - 编写一个通用的 httpservletresponswrapper 来处理大型 Web 应用程序中响应内容类型的所有特殊情况的最佳方法是什么?