当前位置: 首页 > 面试题库 >

Java:跟踪用户登录会话-会话EJB与HTTPSession

亢仰岳
2023-03-14
问题内容

如果我想使用Web应用程序跟踪与每个客户端的对话状态,那么哪个更好的替代方法是使用Session Bean还是HTTP Session?

使用HTTP会话:

//request is a variable of the class javax.servlet.http.HttpServletRequest
//UserState is a POJO
HttpSession session = request.getSession(true);
UserState state = (UserState)(session.getAttribute("UserState"));
if (state == null) { //create default value .. }
String uid = state.getUID();
//now do things with the user id

使用会话EJB:

在执行ServletContextListener时注册为Web应用程序侦听器WEB-INF/web.xml

//UserState NOT a POJO this this time, it is
//the interface of the UserStateBean Stateful Session EJB
@EJB
private UserState userStateBean;

public void contextInitialized(ServletContextEvent sce) {
    ServletContext servletContext = sce.getServletContext();
    servletContext.setAttribute("UserState", userStateBean);
    ...

在JSP中:

public void jspInit() {
    UserState state = (UserState)(getServletContext().getAttribute("UserState"));
    ...
}

同一JSP正文中的其他地方:

String uid = state.getUID();
//now do things with the user id

在我看来,它们几乎是相同的,主要区别在于UserState实例是HttpRequest.HttpSession在前者中传输的,而在ServletContext后者的情况下是的。

两种方法中哪一种更可靠,为什么?


问题答案:

正如@BalusC所指出的,在您的示例中,所有客户端的EJB都是相同的-而不是您想要的。

您仍然可以更改它,并且每个客户端只有一个EJB,例如,当您在用户登录并将其存储在会话中时创建EJB或类似的东西时。

但是,使用HttpSession和有状态会话Bean(SFSB)之间还有其他更细微的区别。特别是这两个:

  1. 异常处理 。如果EJB中的事务失败,则Bean无效并且无法再使用。这会使Web应用程序中的错误处理策略复杂化。
  2. 并发性 。不能同时访问同一SFSB,因此您需要在Web层中对其进行同步。同样,这会使设计复杂化。

有关更多详细信息,请参见此答案:正确将SFSB与Servlet结合使用

总结:我建议您采取这种HttpSession做法,并反对您的SFSB;仅在SFSB提供了您无法使用的功能时才使用SFSB,事实HttpSession并非如此。



 类似资料:
  • Cookie 通过 HTTP cookie 的会话跟踪是最常用的会话跟踪机制,且所有 servlet 容器都应该支持。 容器向客户端发送一个 cookie,客户端后续到服务器的请求都将返回该cookie,明确地将请求与会话关联。会话跟踪 cookie 的标准名字必须是JSESSIONID。容器也允许通过容器指定的配置自定义会话跟踪cookie的名字。 所有 servlet 容器必须提供能够配置容器

  • 问题内容: 我想在学习活动中构建一个简单的Web应用程序。如果遇到首次访问者,Webapp应该要求用户输入他们的email_id,否则它会通过cookie记住用户并自动登录以执行功能。 这是我第一次创建基于用户的Web应用程序。我心中有一个蓝图,但是我无法弄清楚如何实现它。首先,我对收集用户cookie的方式感到困惑。我研究了各种教程和flask_login,但是与flask_login所实现的相

  • 问题内容: 我有一些PHP脚本可以登录,如果登录成功,则返回带有会话ID的JSON数组。 在我的应用程序中,我想登录首页并继续进行登录。我创建了一个单例类,其中包含一个会话ID(以及其他一些字段),该ID从PHP页面从JSON接收。根据用户的操作检查此单例对象的字段“ session_id”。 如果用户要注销,则将session_id设置为null从而注销。 登录时,我还使用HttpURLConn

  • 在我以前做编码的时候,我主要使用无状态的会话bean,所有跨页遍历所需的信息都放在HTTP Session对象中。当时(甚至现在),我从来没有理解过EJB的“USP”对于“业务层”实现是“透明的”和“安全的”,它处理骨架和存根以及其他行话的各种方法,这些行话是以易用性/安全性为名的矫枉过正的伪装。我只是想知道,如果可以通过SLSB+HttpSession实现同样的功能,那么为什么要使用有状态会话E

  • 问题内容: 我刚刚完成了在PHP中创建整个登录和注册systsem的操作,但是我的问题是我还没有使用任何会话。我是PHP的新手,以前从未使用过会话。我想做的是,在用户注册并填写登录表单后,他们仍将停留在同一页面上。因此,其中一部分将是会话已登录,另一部分将是其他(用户未登录,请显示登录表单)。谁能告诉我如何开始? 问题答案: 希望这可以帮助 :) 开始会话,您需要在页面顶部或在调用会话代码之前说出

  • 我有一个与CRUD能力的平均应用程序完全测试与邮递员。我一直试图坚持登录相当长的一段时间,现在没有运气。我已经阅读并尝试了以下内容 护照文档 Toon Io关于登录的博客 快速会话 苏格兰io,节点auth容易 加上一些其他简单的阅读材料(很多这样的问题) 但是我只能注册和登录一个用户,不能用会话持久登录。 下面是我对用户登录的理解,包括我的项目中的代码示例和邮递员结果的截图以及控制台日志。 我有