设计问题-servlet、JSP、自定义标记、html

设计问题-servlet、JSP、自定义标记、html,jsp,servlets,jsp-tags,Jsp,Servlets,Jsp Tags,我不熟悉servlet和JSP。我想知道,对于我正试图编写代码的示例问题,最好的设计是什么。这是- 我想创建一个网站(www.example.com),它只列出每个用户的登录历史记录(不是任何人想要的功能,而是为了一个用户而提供的一个示例) 这里有两个URL-/index.jsp和/login(假设所有注册都完成了) jsp将显示该用户过去的所有登录。但为此,我必须确定用户是否已经登录。如果用户已经登录,我会显示他的历史记录,否则我会自动将他转发到登录页面 我已经编写了一个自定义的加密强cook

我不熟悉servlet和JSP。我想知道,对于我正试图编写代码的示例问题,最好的设计是什么。这是-

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

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

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

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

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

我想我的问题更多地与JSP和/或自定义标记库中java代码的正确使用有关。你想说什么就说什么:)

谢谢你的阅读

  • 瓦斯
您可以为此使用。通过这种方式,您可以将代码逻辑保留在单个位置,而无需在所有JSP页面上不必要地复制粘贴相同的代码,而且还可以使JSP脚本免费

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

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

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error.
}
要检查用户是否已登录,请使用
过滤器
。执行以下方法:

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模式
,如
/secured
/restricted
/users
等。将受限制的JSP页面也放在webcontent的同一文件夹中

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

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

// Or, more drastically, invalidate the entire session:
request.getSession().invalidate();
也就是说,JavaEE已经提供了声明式(基于xml配置)容器管理的安全性,您可以找到关于它的教程。您可以使用它,但是如果您想让您的应用程序独立地拦截容器管理的登录,例如保留登录历史的概述,那么您仍然需要创建一个
过滤器
。例如:

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);

谢谢直到现在我才知道过滤器。我简短地查阅了一下。它们看起来像我需要的。那么,我说应该使用过滤器来确定JSP中的逻辑和与UI相关的自定义标记(如获取用户名、位置等)是正确的吗?我回答中的第一个链接包含了您需要了解的有关过滤器的信息。他们打算过滤这些请求。JSP只是一种视图技术,也应该按其用途使用:以动态方式显示数据。自定义JSP标记通常仅用于替换重复的HTML片段,例如在单个
中的
+
+
。要控制JSP中的“标准”流,您已经有了用于的JSTL和EL。servlet用于控制、预处理和后处理请求。