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

Java会话管理

易祖鹤
2023-03-14
问题内容

我正在开发一个小型Web应用程序,很有趣,目前仅使用Java
Servlet。我有两个页面,test1和test2。目前,我正在test1中创建一个新会话,如下所示:

    HttpSession session = request.getSession(true);
    if (session.isNew() == false) {
        session.invalidate();
        session = request.getSession (true);
    }

在test2中,我像这样检索会话:

    HttpSession session = request.getSession(false);
    if (session == null) {
        throw new ServletException ("No session.");
    }

因此,问题在于,如果我先进入test2,我总是会得到一个有效的会话,因为浏览器会创建一个会话。我想限制从test1到test2的流量,因此我必须先进入test1。我的计划是最终创建一个将创建会话的登录页面,但是我在这里看到的问题仍然存在。

我该如何处理?我希望任何想法都不要包含第三方图书馆。我正在将其作为学习练习。

谢谢!


问题答案:

这是没有道理的。忘记了request.getSession(boolean)。只需进行会话request.getSession(),再也不用担心无效性/有效性了。

如果要通过会话属性传递数据,则只需执行以下操作test1

request.getSession().setAttribute("test", "foo");

和在test2(这是在被请求的过程 相同 会话 之后 test1):

String test = (String) request.getSession().getAttribute("test"); // Returns "foo".

编辑: 至于使用会话来检查已登录User,只需在登录代码中做类似的事情:

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

然后在Filter映射到url- pattern代表限制区域的上的,只需检查是否User存在:

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

当您注销时,只需User从会话中删除:

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

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

另外,您还可以看看的声明安全管理集装箱在一些简单的条目的帮助web.xmlserver.xml。这样,您无需自己麻烦登录/过滤逻辑。



 类似资料:
  • 成功开发 Web 应用程序的难题之一是在一次用户访问,即会话期间,当用户在一个应用程序的页与页之间跳转的同时,维护用户信息。HTTP 是一种无状态协议,也就是说,Web 服务器将某页的每次访问都当作相互无关的访问来处理;服务器不保留前一次访问的任何信息,即使访问就发生在当前访问的几秒钟之前。正因为这种不记忆以前访问的特性使得编写联机目录之类的应用程序很困难,此类应用程序可能需要跟踪用户在目录的不同

  • HTTP 是一种无状态协议,即服务器不保留与客户交易时的任何状态,所以当我们在开发 HTTP Server 应用时,我们通常会通过 Session 来实现多个请求之间用户数据的共享。您可通过 hyperf/session 来实现 Session 的功能。Session 组件当前仅适配了两种储存驱动,分别为 文件 和 Redis,默认为 文件 驱动,在生产环境下,我们强烈建议您使用 Redis 来作

  • 问题内容: 如何使 connect.sid cookie本身仅是会话cookie,而不是持久性cookie? 我尝试失败 但是cookie仍具有到期时间戳。 问题答案: 以上工作。因此,通过将maxAge设置为null,我确实管理了expressjs以使用会话cookie。ew

  • 成功登录后,我想用新的url继续进行进一步的请求处理。但url正在调用springmvc中的公开服务,其中的安全配置不会检查会话身份验证以获取传入url。请看下面的代码。 当jsp页面提交登录验证时,J_security_check调用目标url,该URL随后调用拦截器模式/home*并验证登录凭证。 如果我在登录之前调用公开的服务“/address/userid/”,它将直接调用服务方法,使其成

  • 我正在开发一个使用Spring框架和Hibernate作为ORM的Web应用程序。我想创建一个注册和登录页面。登录时,应为特定用户创建会话(例如发送cookie等)。由于我是Spring的新手,我不知道如何完成这项工作。有人可以给我一个很好的教程吗?谢谢!

  • 我在使用Netty框架为UDP设置会话管理系统时遇到了一些问题。我对每个UDP远程客户端的新内容感到困惑。对于每个新的UDP远程客户端,该客户端是否获得一个新的ChannelPipelineFactory,或者每个新的远程客户端都创建一个新的通道? 我有两个端口,端口161和端口162,这两个端口都是UDP端口,并且都将从许多UDP客户端接收数据。如何区分客户?我开始基于提供的创建会话管理服务,但