2010-05-09 33 views

回答

5

您可以使用ServletContext#getResource()

URL resource = getServletContext().getResource("/WEB-INF/file.ext"); 
File file = new File(resource.getPath()); 
// ... 

你甚至可以使用ServletContext#getResourceAsStream()獲得一個InputStream直接:

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.ext"); 
// ... 

正如你在例子中看到,該ServletContext是由繼承GenericServlet#getServletContext()方法的servlet可用。


也就是說,短語我不希望用戶有我的任何資源的直接訪問。有點矛盾。無論如何,您是通過servlet來提供這些資源的?一個servlet可以通過URL直接訪問。這與「直接訪問」有什麼不同?或者你只是想根據某些條件來控制訪問?我會說,Filter更適合這個任務。

通常只能完全隱藏JSP文件以免直接訪問。在作爲前端控制器(根據MVC模式)的Servlet中,您可以使用RequestDispatcher#forward()將請求轉發到JSP文件,然後您可以通過ServletRequest#getRequestDispatcher()獲取這些請求。

request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response); 
+0

我以爲原來的問題是,「我不希望用戶能夠通過輸入直接的URL在瀏覽器中查看資源」。把你想要阻止「直接訪問」的文件放到WEB-INF中,讓servlet訪問資源聽起來像是「最佳實踐」。 – WineSoaked 2010-05-09 02:36:00

+0

@WineSoaked:通常關心的只是JSP文件,因爲您想在完全MVC控制的應用程序中隱藏視圖。但對於像CSS/HTML/Images/JS這樣的靜態資源?不,問題的解決方式不同。由於實際的功能要求並不清楚,所以只是不清楚*如何。 – BalusC 2010-05-09 02:37:33

+0

你說得很好。但是,如果servlet在運行時生成資源(即使我不同意這種做法,我的經驗並非前所未聞)?如果有這些CSS/HTML/JS /等的片段。通過一個servlet處理,這是一個合理的用法。但是,如果您只是將沒有做任何事情的WEB-INF中的字節傳給瀏覽器,那麼這個servlet就扮演了一個代理角色,而這個代理角色是不合適的。 – WineSoaked 2010-05-09 03:11:14