簡體   English   中英

非 Spring MVC 應用程序中的 MultipartFilter

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM