我是servlets和jsps的新手。我想知道我试图编写代码的示例问题的最佳设计是什么。在这里 -
我想创建一个网站(www.example.com),它只列出每个用户的登录历史记录(不是任何人想要的功能,而只是一个例子)。
所以这里有两个网址 - /index.jsp和/ login(让我们假设所有注册都已完成)。
index.jsp将显示该用户的所有过去登录信息。但为此,我必须确定用户是否已登录。如果用户已经登录,我会向他显示他的历史记录,否则我必须自动将他转发到登录页面。
我已经编写了一个自定义加密强cookie,它会告诉我用户是否登录。因此,如果cookie被发送给我,我可以验证他是否经过身份验证,或者cookie /会话是否已过期。这不是问题。
我遇到的设计问题是 - 如何调用java类检查身份验证?我是否使用自定义jsp标签来检查并重写页面?我希望我的html开发人员在创建新页面时能够轻松使用该类。做这个的最好方式是什么?
我想我的问题更多地与在jsps中正确使用java代码和/或可能是自定义标记库有关。请随心所欲地继续咆哮:)
感谢阅读。
答案 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);