我对Java中的MVC web应用程序有一个非常基本的问题。
从原始JSP的旧时代到Seam等当前技术,一个非常基本的模式一直是从最初接受请求的控制器到创建要发送到客户端的输出的视图层的内部调度。
这种内部调度通常是通过使用URL向servlet容器请求新资源来完成的(尽管该机制可能通过额外的配置层隐藏)。这些URL的映射是由同一个web.xml完成的,该web.xml还定义了到外部的"真实"URL。
除非采取特殊措施,否则通常可以直接访问视图图层。看看Seam的"registration"演示,在那里你可以绕过"register.Seam",直接转到"registered.xhtml"。这是一个潜在的安全问题。至少,它泄露了视图模板的源代码。
我知道这只是一个基本的示例应用程序,但奇怪的是,还需要采取任何额外措施来宣布这些内部资源对外部不可见。
限制URL入口点的最简单方法是什么?
是否有类似"WEB-INF"目录的东西,一个只能由内部请求访问的神奇URL路径组件?
您可以通过在web.xml
部署描述符中使用security-constraint
来阻止对内部资源的访问。
例如,我使用以下配置来防止直接访问JSP:
<!-- Prevent direct access to JSPs. -->
<security-constraint>
<web-resource-collection>
<web-resource-name>JSP templates</web-resource-name>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint/> <!-- i.e. nobody -->
</security-constraint>
我不建议允许Internet请求直接访问您的应用程序服务器。我会把一个网络服务器放在前面,然后在里面,允许请求某些类型的URL。不希望人们去foo.com/jsps?一劳永逸地限制它。
这里有一个关于这个话题的对话:在WEB-INF后面隐藏页面?
处理此问题的一种方法是构造Servlet Filter,它检查每个请求的请求路径并相应地处理每个请求。这里有一个链接可以帮助您开始使用JavaServerPages(JSP)和JSTL-使用JSP
我现在看到了几个将内部JSP放入WEB-INF/jsp
的应用程序。这似乎起到了作用,至少对JSP和Velocity来说都是如此。不过,它似乎不适用于JSF。