1

我正在用 JSP 编写一个网站。有些页面用户必须登录才能查看。如果他们没有登录,他们应该会看到一个登录表单。我在 php 代码中看到您可以创建一个 .jsp 页面(单个文件),该页面检查用户是否登录。如果没有,它将显示登录表单。如果用户已登录,则不会执行任何操作。所以为了做到这一点,我在我的 JSP 中使用了这个结构:

页眉、菜单等等等...正常的东西,例如正文、页脚给登录用户。

这种结构很容易应用于所有网页。所以我不必对每个网页都应用检查算法!我可以简单地添加这个“”并且页面是安全的!

所以我的问题是,如果用户没有登录,那么只应该显示登录表单和页脚。所以代码应该绕过主体。因此将我的 checklogin.jsp 结构化为:

如果用户未登录,则显示登录表单和页脚并终止请求。问题是我不知道如何终止请求......如果我使用“return;” 然后只有 checklogin.jsp 停止,但服务器继续处理父页面!因此页面有 2 个页脚!(1 个来自父页面,1 个来自 checklogin.jsp)。我怎样才能避免这种情况?

(顺便说一句,在 php 中有 exit(); !)

感谢您的任何建议!

编辑1:我也尝试过 response.getOutputStream().close(); 但似乎没有用。

编辑 2:我在 PHP 中需要一个类似物:exit();

4

2 回答 2

2

好的,我的问题的答案是 out.close(); 这只是结束响应。感谢 JB Nizet 指出了这个问题的另一个方面。

于 2012-07-01T11:02:27.663 回答
1

您可以像使用任何编程语言一样进行操作:

<c:choose>
    <c:when test="userIsLoggedIn">
        normal header, body
    </c:when>
    <c:otherwise>
        login form
    </c:otherwise>
</c:choose>
footer

但主要问题是你根本不应该这样做。应该使用 JSP 来生成标记。不检查用户是否登录并根据结果显示页面或其他页面。您应该在 Java 中,在分派到适当 JSP 的 servlet 中执行此操作。这就是 MVC 模式。

而且由于几乎所有请求都应该这样做,因此您甚至应该在 servlet 过滤器中这样做。过滤器映射到一组 URL,如 servlet,并拦截对这些 URL 的所有请求。因此,过滤器将检查用户是否已登录,如果没有,则转发或重定向到登录页面。如果用户通过了身份验证,除了让请求转到映射到 URL 的 servlet/JSP 之外,它不会做任何事情。

例如,阅读http://www.oracle.com/technetwork/java/filters-137243.html,了解有关过滤器的更多信息。

于 2012-06-30T15:12:21.890 回答