Java 非Spring MVC应用程序中的MultipartFilter
在Tomcat6中的Javaservlet(2.5)中,我们使用Spring和SpringSecurity3,但不使用SpringMVC。我们试图实现CSRF安全性,因此我们在所有表单中添加了Java 非Spring MVC应用程序中的MultipartFilter,java,spring,servlet-filters,multipartform-data,Java,Spring,Servlet Filters,Multipartform Data,在Tomcat6中的Javaservlet(2.5)中,我们使用Spring和SpringSecurity3,但不使用SpringMVC。我们试图实现CSRF安全性,因此我们在所有表单中添加了\u CSRF令牌。对于文件上载,我们在web.xml中添加了org.springframework.web.multipart.support.MultipartFilter,并修复了commons文件上载依赖项 我们可以看到请求已被解析和包装,但spring security也在再次包装请求,因此我们不
\u CSRF
令牌。对于文件上载,我们在web.xml
中添加了org.springframework.web.multipart.support.MultipartFilter
,并修复了commons文件上载依赖项
我们可以看到请求已被解析和包装,但spring security也在再次包装请求,因此我们不能再访问多部分数据了,是吗?我尝试将请求对象强制转换为multipartttpServletRequest
,但失败了。internet上的所有示例都显示了如何在SpringMVC控制器中访问文件项。我在这里有点迷路了。
所有这些包装都是从标准接口扩展而来的。只需对其进行强制转换,通过方法获取包装的请求,然后测试它 如果它实际返回了另一个
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;
}
至于额外的问题:您的webapp的运行时类路径包含Servlet3.0+API。如果这不是目的,那么它很可能只是一个脏的运行时类路径。只需清理它就可以摆脱Servlet3.0+库。webapp的运行时类路径所涵盖的文件夹有a.o.WAR的
/WEB-INF/lib
、server的/lib
和JRE的/lib尽管我喜欢BalusC更好地解决它的方式(使用while循环与递归),但我认为值得一提的是
import org.springframework.web.util.WebUtils;
...
WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
做同样的事情,但只是用一个递归,但在一个受良好支持的Lib类中:)额外的问题:我确信我们只使用servlet2.5,为什么存在HttpServlet3RequestFactory!?你能发布你的web.xml
吗?太好了,可以了!谢谢我想我找到了servlet 3.0出现的原因。。。我的开发机器使用Tomcat7,它在lib文件夹中有Servlet3.0API。不客气。如果Spring在web.xml
中选中version
,它会玩得更好。
import org.springframework.web.util.WebUtils;
...
WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);