我怎样才能手动加载使用JSESSIONID Java会话?(How can I manually l

2019-07-20 07:21发布

我有一个处理一个多形式后的servlet。 后实际上是由于在页面中嵌入Flash文件上传组件制造。 在某些浏览器,Flash生成的POST不包括这使它不可能对我来说,在开机时加载从会话某些信息的JSESSIONID。

闪光灯组件上传不包括特殊形式场内cookie和session信息。 使用这个表单域,其实我可以检索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());
    }

这增加了所有会话ServletContext中通过唯一的ID映射属性。 我可以把一个地图的背景下,会议代替,但它似乎是多余的。 请张贴在这个决定有什么想法。 接下来,我下面的方法添加到我的servlet来解决由ID会话:

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

Answer 1:

有没有API通过ID来检索会话。

你能做什么,但是,是实现会话监听器在Web应用程序和手动维护地图的ID键控会话(session id的是通过检索session.getId() )。 然后,您就可以检索到您想要的(而不是欺骗容器与它替换当前的会话等建议)任何会议



Answer 2:

以安全的方式做到这一点是设置jsession ID在cookie中 - 这是不是在网址中设置它更安全。

一旦它被设置为一个cookie,那么你可以使用恢复正常方式的会议

request.getSession();

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


Answer 3:

还有就是Servlet规范中没有办法,但你可以尝试:

  • 手动设置由Flash作出请求的饼干

  • 或做泰勒我只是建议作为我打字并添加JSESSIONID参数的URI的路径。

这两种方法会配合你的应用程序上的行为如Tomcat servlet容器运行; 我认为,他们中的大多数。 双方还需要您的Flash小程序要求页的饼干,其可施加一个JavaScript依赖。



Answer 4:

这是一个非常好的职位。 我使用会话监听器以增加会话的上下文中看到一个潜在的问题是,它可以得到相当的脂肪取决于你的并发会话数。 然后所有的听众Web服务器配置的额外工作。

那么这个怎么样一个更简单的解决方案。 我没有实现这个和它的作品相当不错的。 所以加载的Flash上​​传对象的页面上,存储会话和会话ID在应用程序对象中的键值对那么会话ID传递到上传页面作为之后的参数。 在上传页面上,看看是否会话ID已经在应用程序中,如此使用该会话,否则,您可以通过请求之一。 此外,然后继续前进,从应用程序中删除该键把一切都干净。

在SWF网页:

application.setAttribute(session.getId(), session);

然后上传页面上:

String sessid = request.getAttribute("JSESSIONID");
HttpSession sess = application.getAttribute(sessid) == null ?
        request.getSession() :
        (HttpSession)application.getAttribute(sessid);
application.removeAttribute(sessid);

很不错的解决方案家伙。 感谢这个。



Answer 5:

如果您使用的是Tomcat,你问tomcat的直接(但它的丑陋)。 我敢打赌,还有其他的web服务器等哈克解决方案。

它采用“经理人”接口的实例来管理会话。 是什么使得它丑陋的是,我还没有找到一个很好的公共接口可以挂接到,所以我们必须使用反射来获取经理。

下面是争夺上下文初创公司经理上下文侦听器,然后可以用来获得Tomcat的会话。

public class SessionManagerShim implements ServletContextListener {
    static Manager manager;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        try {
            manager = getManagerFromServletContextEvent(sce);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        manager = null;
    }

    private static Manager getManagerFromServletContextEvent(ServletContextEvent sce) throws NoSuchFieldException, IllegalAccessException {
        // Step one - get the ApplicationContextFacade (Tomcat loves facades)
        ApplicationContextFacade contextFacade = (ApplicationContextFacade)sce.getSource();

        // Step two - get the ApplicationContext the facade wraps
        Field appContextField = ApplicationContextFacade.class.getDeclaredField("context");
        appContextField.setAccessible(true);
        ApplicationContext applicationContext = (ApplicationContext)
                appContextField.get(contextFacade);

        // Step three - get the Context (a tomcat context class) from the facade
        Field contextField = ApplicationContext.class.getDeclaredField("context");
        contextField.setAccessible(true);
        Context context = (Context) contextField.get(applicationContext);

        // Step four - get the Manager. This is the class Tomcat uses to manage sessions
        return context.getManager();
    }

    public static Session getSession(String sessionID) throws IOException {
        return manager.findSession(sessionID);
    }
}

您可以将其添加为在web.xml监听器,它应该工作。

然后,你可以这样做是为了获得一个会话。



文章来源: How can I manually load a Java session using a JSESSIONID?