![](/img/trans.png)
[英]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.