如何使用 JSESSIONID 手动加载 Java 会话?

我有一个处理多部分表单帖子的servlet。该帖子实际上是由嵌入在页面中的Flash文件上传组件制作的。在某些浏览器中,Flash生成的POST不包括JSESSIONID,这使我无法在发布期间从会话中加载某些信息。

闪存上传组件在特殊表单字段中包含 Cookie 和会话信息。使用此表单字段,我实际上可以检索 JSESSIONID 值。问题是,我不知道如何使用这个JSESSIONID值来手动加载该特定会话。

编辑 -基于ChssPly76的解决方案,我创建了以下HttpSessionListener实现:

    @Override
    public void sessionCreated(final HttpSessionEvent se) {
        final HttpSession session = se.getSession();
        final ServletContext context = session.getServletContext();
        context.setAttribute(session.getId(), session);
    }

    @Override
    public void sessionDestroyed(final HttpSessionEvent se) {
        final HttpSession session = se.getSession();
        final ServletContext context = session.getServletContext();
        context.removeAttribute(session.getId());
    }

这会将所有会话作为由其唯一 ID 映射的属性添加到 ServletContext 中。我可以将会话地图放在上下文中,但这似乎是多余的。请发布有关此决定的任何想法。接下来,我将以下方法添加到我的 servlet 中,以按 id 解析会话:

    private HttpSession getSession(final String sessionId) {
        final ServletContext context = getServletContext();
        final HttpSession session = (HttpSession) context.getAttribute(sessionId);
        return session;
    }

答案 1

没有用于按 id 检索会话的 API。

但是,您可以做的是在 Web 应用程序中实现会话侦听器,并手动维护按 id 键控的会话映射(会话 ID 可通过 session.getId()检索)。然后,您将能够检索所需的任何会话(而不是像其他人建议的那样欺骗容器将其替换为当前会话)


答案 2

一种安全的方法是在cookie中设置jsession id - 这比在URL中设置它要安全得多。

一旦将其设置为cookie,您就可以使用正常方式检索会话

request.getSession();

method.setRequestHeader("Cookie", "JSESSIONID=88640D6279B80F3E34B9A529D9494E09");

推荐