我想知道是否有人有解决方案通过servlet访问网站的资源。 我有我的所有资源在WEB-INF下。换句话说,我不希望用户直接访问我的任何资源。通过servlet访问资源(CSS,HTML,图像,JS)
3
A
回答
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
您可以从最终用户隐藏jsp。事实上,你甚至不用来部署Web应用程序原有的jsp文件,你可以预编译它们:
http://tomcat.apache.org/tomcat-5.5-doc/jasper-howto.html#Web%20Application%20Compilation
,并隐藏HTML/JS的必由之路/ css文件没有使用它们。任何发送到浏览器的内容都可以在那里查看。
我以为原来的问题是,“我不希望用户能够通过输入直接的URL在浏览器中查看资源”。把你想要阻止“直接访问”的文件放到WEB-INF中,让servlet访问资源听起来像是“最佳实践”。 – WineSoaked 2010-05-09 02:36:00
@WineSoaked:通常关心的只是JSP文件,因为您想在完全MVC控制的应用程序中隐藏视图。但对于像CSS/HTML/Images/JS这样的静态资源?不,问题的解决方式不同。由于实际的功能要求并不清楚,所以只是不清楚*如何。 – BalusC 2010-05-09 02:37:33
你说得很好。但是,如果servlet在运行时生成资源(即使我不同意这种做法,我的经验并非前所未闻)?如果有这些CSS/HTML/JS /等的片段。通过一个servlet处理,这是一个合理的用法。但是,如果您只是将没有做任何事情的WEB-INF中的字节传给浏览器,那么这个servlet就扮演了一个代理角色,而这个代理角色是不合适的。 – WineSoaked 2010-05-09 03:11:14