如何使用servlet分离IE8的新浏览器实例的会话?

时间:2013-04-25 10:28:58

标签: java session servlets

我面临着创建新会话并同时维护前一会话的问题。

我的代码在Servlet中。它适用于IE以外的所有其他浏览器,也适用于IE7和更低版本,但不适用于IE8和IE9。我非常清楚IE8& IE9对每个新请求使用相同的会话;但我想为我的Java EE应用程序的每个新初始请求创建一个新会话。 当会话为空时,我第一次编写了用于创建新HTTPSession的代码,并且还为新会话添加了代码。

如果不为每个页面维护任何隐藏的变量值或通过URL发送会话ID,我可以做什么来为新会话编码更改?有没有其他方法可以分开两个或更多会话?

我的Servlet代码快照如下所示:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    process(request, response);
}

private void process (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String strErrorMsg = null;
    response.setContentType ( "text/html" );
    HttpSession session = null;
    Cookie cookies[] = request.getCookies();

    if (session == null) {
        ServletContext appContext = getServletContext();
        WebProcessContextBuilder builder =  WebProcessContextBuilder.getInstance();
        ProcessContext objContext = null;
        try {
            session = request.getSession(true);
            // Code for setting some initial session attributes and forwarding request 
            // to first window to display.
        }
    }

    if (session != null && session.isNew()) {
        // Code for new session to forward my request with saving session id 
        // as well as setting session attributes
    } else {
        // code for showing alert message like "Session active in another window or tab.";
    }
}

使用上面的代码,第二次尝试加载新应用程序时,我总是收到错误消息。这是因为我得到的会话不等于null,而session.isNew在IE8& IE9。在其他地方它可以正常工作。

1 个答案:

答案 0 :(得分:0)

这看起来不对:

HttpSession session = null;
Cookie cookies[] = request.getCookies();

if (session == null) {

会话如何在这里不为空?

我认为应该是:

// Try to get the session, but don't create one if there isn't one
HttpSession session = request.getSession(false);
Cookie cookies[] = request.getCookies();

if (session == null) {