使 JSP 仅可通过 RequestDispatcher#include 访问

Make JSP accessible via RequestDispatcher#include only

我要解决的问题是我在 Tomcat 7 上有一个 Web 项目 运行,其中大部分可公开访问 JSP 页面,但也有一些 JSP 不应公开访问的页面。这些 "private" 页面被各种 servlet 使用,如下所示:

response.setContentType(...);
request.getRequestDispatcher("/private/example.jsp").include(request, response);

我希望 RequestDispatchaer#include() 可以访问私人 JSP 页面,但是 不能 如果客户端导航到例如/private/example.jsp直接.

我现在处理这个问题的方式是从 servlet 设置请求属性:

request.setAttribute("okToAccess", true);

然后在 JSP 页面中检查该属性,如果未找到则返回一个空文档。这样做的两个缺点是:

  1. 代码很繁琐,写起来很烦人。
  2. 通过 include 调度的 Servlet 不能修改响应 status/headers 所以我不能,例如从 JSP 发回 403 或 404,我必须实现稍微复杂一点的逻辑来让调用 servlet 发出错误响应。

我的问题是:是否有更简洁的方法来阻止对这些 "private" JSP 的直接访问,同时仍然让它们与 include() 一起使用?我可以放入 web.xml 之类的东西吗?

Web 容器不会直接提供存储在 WEB-INF 中的任何内容。将您的私人 jsp 文件放在该文件夹中以通过 servlet 强制请求。