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

Rob*_*ell 29 java session servlets java-ee httpsession

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

Flash上​​传组件确实包含特殊表单字段中的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());
    }
Run Code Online (Sandbox Code Playgroud)

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

    private HttpSession getSession(final String sessionId) {
        final ServletContext context = getServletContext();
        final HttpSession session = (HttpSession) context.getAttribute(sessionId);
        return session;
    }
Run Code Online (Sandbox Code Playgroud)

Chs*_*y76 24

没有用于按ID检索会话的API.

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

  • 它可以工作,但是在集群场景中的会话复制又如何呢?据我所知,servlet上下文没有被复制。 (2认同)