0

我是 servlet 和 jsps 的新手。我想知道对于我正在尝试编写代码的示例问题,最好的设计是什么。开始 -

我想创建一个网站(www.example.com),它只列出每个用户的登录历史(不是任何人想要的任何功能,而只是一个示例)。

所以这里有两个 URL - /index.jsp 和 /login(假设所有注册都已完成)。

index.jsp 将显示该用户过去的所有登录信息。但为此,我必须确定用户是否已经登录。如果用户已经登录,我会向他展示他的历史记录,否则我必须自动将他转发到登录页面。

我已经编写了一个自定义的加密强 cookie,它会告诉我用户是否登录。因此,如果将 cookie 发送给我,我可以验证他是否已通过身份验证,或者 cookie/会话是否已过期。那不是问题。

我遇到的设计问题是 - 如何调用检查身份验证的 java 类?我是否使用自定义 jsp 标签来检查并重写页面?我想让我的 html 开发人员在创建新页面时轻松使用该类。做这个的最好方式是什么?

我想我的问题与在 jsps 中正确使用 java 代码和/或可能是自定义标记库有关。请随意继续咆哮,只要你想:)

谢谢阅读。

  • 瓦斯
4

1 回答 1

2

您可以Filter为此使用 a 。这样,您可以将代码逻辑保存在一个地方,而无需在所有 JSP 页面上不必要地复制粘贴相同的代码,并且它还可以很好地保持 JSP 无脚本

您也可以只使用 Java EE 提供的HttpSessionAPI,而不是通过自己创建 cookie 来重新发明会话。这基本上已经由 cookie 支持,您可以将 Java 对象作为属性存储在会话中,以便它们在整个用户会话中保持可用。

登录时只需将User对象放入HttpSession

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error.
}

要检查用户是否已登录,请使用Filter. 实现doFilter()方法如下:

if (((HttpServletRequest) request).getSession().getAttribute("user") != null) {
    chain.doFilter(request, response); // User is logged in, just continue with request.
} else {
    ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
}

并将其映射到url-patternlike /secured/restricted/usersso 上。将需要限制的 JSP 页面也放在 webcontent 的同一个文件夹中。

要注销用户,只需将其从会话中删除:

request.getSession().removeAttribute("user");

// Or, more drastically, invalidate the entire session:
request.getSession().invalidate();

也就是说,Java EE 已经提供了声明式(基于 xml-config)容器管理的安全性,您可以在此处找到有关它的教程。你可以使用它,但是如果你想让你的应用程序独立地拦截容器管理的登录,例如保持对登录历史的概述,那么你仍然需要创建一个Filter. 例如:

HttpServletRequest httpRequest = (HttpServletRequest) request;
UserPrincipal user = httpRequest.getUserPrincipal();
HttpSession session = httpRequest.getSession();
if (user != null && session.getAttribute("user") == null) {
    session.setAttribute("user", user);

    // First-time login. You can do your intercepting thing here.
}
chain.doFilter(request, response);
于 2009-12-13T17:14:26.443 回答