使 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 页面中检查该属性,如果未找到则返回一个空文档。这样做的两个缺点是:
- 代码很繁琐,写起来很烦人。
- 通过
include
调度的 Servlet 不能修改响应 status/headers 所以我不能,例如从 JSP 发回 403 或 404,我必须实现稍微复杂一点的逻辑来让调用 servlet 发出错误响应。
我的问题是:是否有更简洁的方法来阻止对这些 "private" JSP 的直接访问,同时仍然让它们与 include()
一起使用?我可以放入 web.xml
之类的东西吗?
Web 容器不会直接提供存储在 WEB-INF 中的任何内容。将您的私人 jsp 文件放在该文件夹中以通过 servlet 强制请求。
我要解决的问题是我在 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 页面中检查该属性,如果未找到则返回一个空文档。这样做的两个缺点是:
- 代码很繁琐,写起来很烦人。
- 通过
include
调度的 Servlet 不能修改响应 status/headers 所以我不能,例如从 JSP 发回 403 或 404,我必须实现稍微复杂一点的逻辑来让调用 servlet 发出错误响应。
我的问题是:是否有更简洁的方法来阻止对这些 "private" JSP 的直接访问,同时仍然让它们与 include()
一起使用?我可以放入 web.xml
之类的东西吗?
Web 容器不会直接提供存储在 WEB-INF 中的任何内容。将您的私人 jsp 文件放在该文件夹中以通过 servlet 强制请求。