设计问题 - servlets,jsps,自定义标签,html

时间:2009-12-13 16:59:45

标签: jsp servlets jsp-tags

我是servlets和jsps的新手。我想知道我试图编写代码的示例问题的最佳设计是什么。在这里 -

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

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

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

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

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

我想我的问题更多地与在jsps中正确使用java代码和/或可能是自定义标记库有关。请随心所欲地继续咆哮:)

感谢阅读。

  • 沃什

1 个答案:

答案 0 :(得分:2)

您可以使用Filter。通过这种方式,您可以将代码逻辑保存在一个位置,而无需在所有JSP页面上不必要地复制相同的代码,并且还可以很好地保持JSP scriptlet

不是通过自己创建cookie来重新发明会话,而是还可以使用提供HttpSession API的Java EE。这基本上已经由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-pattern,例如/secured/restricted/users左右。将受限制的JSP页面放在webcontent中的同一文件夹中。

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

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

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

也就是说,Java EE已经提供了声明式(基于xml-config)的容器管理安全性,你可以找到一个关于它的教程here。您可以使用它,但如果您想让您的应用程序在容器管理的登录中独立拦截,以便保持对登录历史记录的概述,那么您仍然需要创建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);