2010-05-09 66 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