2012-07-23 108 views
0

我有一個非常標準的Spring 3.0.7 Web應用程序春返回受保護的資源

的結構是這樣的

WebContent/ 
    resources/ 
     myStaticConent/ 
    WEB-INF/ 
     views/ 
     myProtectedContent/ 

我現在用的是<mvc:resources>配置靜態內容和我的控制器得到的意見使用InternalViewResolver從WEB-INF /意見

現在我有一個要求,從受保護的目錄中返回非JSP內容(JPG不同,PNG,HTML等),WEB-INF

所以用戶可能會輸入一個像http:myWebApp/myProtectedContent這樣的URL並打到我受保護的內容控制器。

@Controller 
public class HelloWorldController { 

@RequestMapping(value="/myProtectedContent") 
public String index() { 
    return "myjpg.jpg"; 
} 
} 

基本上我希望有條件成爲一個文件,就像我會一個視圖。任何人都知道如何做到這一點?

我看了一些其他的方法,使用Inputstream Streaming對於基本上是靜態的文件似乎有些過分。我可以註冊另一種「視圖」類型嗎?我需要這樣做(從Web瀏覽器端),就像標準的http請求響應一樣(比如當前的視圖實現)。

我真的想避免發明了我自己的文件處理方法,除非有一些理由使用該文件訪問方法是更好然後泉城「其他」視圖解析器像ResourceBundleResolver

所以要求 有條件迴應一個來自WEB-INF內部的具有可變文件類型(jpg,png,html)的http請求,不包含在jsp中或者由JSTL視圖解釋該文件。文件的名稱是已知的並且是靜態的。控制器將根據自己的業務邏輯確定文件名。

+0

您希望以何種方式有條件地提供內容?不同的用戶獲得不同的資源嗎?所有資源都是安全的,並且任何登錄人員都可以獲取所有資源,但是您希望單個URL根據用戶返回不同的內容嗎?如果你能更清楚地瞭解這些要求,那可能會有所幫助。謝謝。 – Kieran 2012-07-24 15:50:10

+0

@Kerian我認爲用例是一個不同的問題,而不是我的信息來分享。我會澄清我在找什麼。 – stimpy 2012-07-24 16:15:04

回答

1

您可以複製的<mvc:resources/>org.springframework.web.servlet.resource.ResourceHttpRequestHandler,基本上流式輸出靜態文件的內容底層實現的行爲 - 你可以像ResourceHttpRequestHandler,從org.springframework.web.servlet.support.WebContentGenerator擁有最後修改發送的廣泛支持和緩存相關的延伸頭,最後以流的內容也有Spring框架提供了一個實用工具:

org.springframework.util.FileCopyUtils.copy(resource.getInputStream(), response.getOutputStream()); 

更新時間:

@Controller 
public class HelloWorldController implements ApplicationContextAware { 
    ApplicatonContext ctx = ...; 

    @RequestMapping(value="/myProtectedContent") 
    public void index(HttpServletRequest req, HttpServletResponse res) { 
     Resource resource = ctx.getResource("classpath:staticpath/myjpg.jpg"); 
     FileCopyUtils.copy(resource.getInputStream(), response.getOutputStream()); 
    } 
} 
+0

對於看似簡單的任務而言,這看起來很費勁。創建另一個內部視圖解析器不會更容易?或者使用另一個解析器? – stimpy 2012-07-24 01:05:20

+0

不,這並不複雜,我基本上說的是,您按照您定義的方式定義了控制器,並在方法調用FileCopyUtils.copy(resource.getI ...)中定義了控制器,並且如果您需要任何高級功能如緩存,然後從WebContentGenerator擴展來做到這一點。 – 2012-07-24 01:07:35

+0

FileCopy?我沒有看到如何更好的使用InputStream。另外爲什麼不使用ResourceBundleResolver或UrlResolver?你能舉一個你建議的例子嗎? – stimpy 2012-07-24 14:33:30

0

你可以做的事情就是將一個新的servlet映射到你想要保護的路徑上,並以你想要的方式處理請求。

例如,在web.xml:

<servlet> 
    <servlet-name>protServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/protServlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>protServlet</servlet-name> 
    <url-pattern>/myProtectedContent</url-pattern> 
</servlet-mapping> 

這樣一來,你映射爲保護內容的網址一個新的servlet(DispatcherServlet的)。 如果您已具有此字段值等於1的DispatcherServlet,則啓動時加載值等於2。

+0

感謝vitor,但我需要保持在同一個servlet中的可移植性 – stimpy 2012-07-24 00:49:13