在 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 中访问文件项。我在这里有点迷路了。
最佳答案
所有这些包装器都扩展自标准 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/