[英]Is a parallel Spring-MVC application possible with a non-spring web app?
[英]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.