2015-06-24 160 views
2

在我們的Tomcat 6中的Java servlet(2.5)中,我們使用Spring和Spring安全性3,但沒有使用Spring MVC。我們嘗試實施CSRF安全性,因此我們將_csrf令牌添加到了我們的所有表單中。對於文件上傳,我們將org.springframework.web.multipart.support.MultipartFilter添加到我們的web.xml,並修復了commons-fileupload依賴關係。MultipartFilter在非Spring MVC應用程序中

我們可以看到請求被解析和包裝,但spring安全也在重新包裝請求,所以我們不能再訪問多部分數據了,我們可以嗎?我嘗試將請求對象轉換爲MultipartHttpServletRequest,但失敗。互聯網上的所有例子都展示瞭如何訪問Spring MVC控制器中的文件項目。我在這裏有點失落。 Wrappers wrapping each other

+0

獎金問題:我確定我們只使用servlet2.5,爲什麼會有一個HttpServlet3RequestFactory存在!? – Jasper

+0

你可以發佈你的'web.xml'嗎? – manish

回答

1

所有這些包裝從標準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); 
// ... 

至於獎金問題:你的web應用的運行時類路徑中包含的Servlet的地方3.0+ API。如果這不是意圖,那麼它可能只是一個骯髒的運行時類路徑。只需清理它即可擺脫Servlet 3.0+庫。 webapp的運行時類路徑覆蓋的文件夾是a.o. WAR的/WEB-INF/lib,服務器的/lib和JRE的/lib

+0

太棒了,那有效!謝謝。我想我發現爲什麼存在servlet 3.0 ...我的開發機器使用Tomcat 7,它在lib文件夾中具有Servlet 3.0 API。 – Jasper

+0

不客氣。 如果在'web.xml'中檢查'version',Spring會更好。 – BalusC

0

雖然我喜歡的BalusC如何解決它更好(while循環與遞歸)的方式,我認爲這是值得一提的是,

import org.springframework.web.util.WebUtils; 
... 
WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class); 

不相同,但只要用遞歸,但在以及支持的Lib-Class :)