3

我编写了一个过滤器,它会使当前会话无效并创建新会话并将旧会话的属性复制到新会话中。这在 tomcat5 和 jdk 1,4 中运行良好,但是当我将它切换到 tomcat6 和 jdk 1.6 时,一旦过滤器运行,则下一个请求httprequest.getsession(false )null. 为什么它在 tomcat 6 中的行为不同。请帮忙。这是代码片段

public void doFilter(ServletRequest request, ServletResponse response,
                        FilterChain chain) throws IOException, ServletException 
                        { 
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println("within GenerteNewSessionFilter");
        System.out.println("within GenerteNewSessionFilter getRequestURI"+httpRequest.getRequestURI());
        System.out.println("within GenerteNewSessionFilter getRequestURL"+httpRequest.getRequestURL());

        System.out.println("within GenerteNewSessionFilter session false"+httpRequest.getSession(false));

        String reqUrl=httpRequest.getRequestURL().toString();
        if (reqUrl==null){
            reqUrl="";
        }
        int idxLogin=reqUrl.indexOf("LoginSubmit.jsp");
        int idxReg=reqUrl.indexOf("RegistrationSubmit.jsp");
        int idxErr=reqUrl.indexOf("Error");

    int idxSave=-1;
    System.out.println("within GenerteNewSessionFilter reqUrl "+reqUrl);
    System.out.println("within GenerteNewSessionFilter idxLogin index"+idxLogin);
    System.out.println("within GenerteNewSessionFilter idxReg index"+idxReg);
    System.out.println("within GenerteNewSessionFilter idxErr index"+idxErr);

    if (httpRequest.getSession(false) != null  &&  (idxLogin >0 || idxReg >0) && idxErr <0 ){
      //copy session attributes from old session to a map. 
        System.out.println("copy session attributes from old session to a map");
        HttpSession session = httpRequest.getSession();

      HashMap old=new HashMap();
      Enumeration keys = (Enumeration) session.getAttributeNames();
      while (keys.hasMoreElements()) {
        String key = (String) keys.nextElement();

       old.put(key, session.getAttribute(key));
          session.removeAttribute(key);


      }
      System.out.println("old  session id  "+session.getId());

      //invalidate session and create new session.
      session.invalidate();
      //create new session
      session = httpRequest.getSession(true);

      //copy session attributes from map session to new session
      Iterator it = old.entrySet().iterator(); //iterator
      while (it.hasNext()) {
          Map.Entry pairs = (Map.Entry)it.next();
          //putitng old attributes in to new session
          session.setAttribute((String) pairs.getKey(), pairs.getValue());

      }//end while loop
          System.out.println("end copy  session attributes");
          System.out.println("new session id status "+httpRequest.getSession(false));
          System.out.println("final new   session session id  "+session.getId());
    }
    chain.doFilter(request, response);
    }
      public void init(FilterConfig filterConfig) throws ServletException {


    }

}         
4

2 回答 2

2

HttpServletRequest.getSession(boolean create)的 javadoc明确指出,如果您将一个false值传递给它的参数,它只会返回HttpSession一个已经存在的值。如果没有与请求关联的会话,它将返回null.

因此,如果您使当前会话无效,显然request.getSession(false)在您的下一个请求中调用将返回null.

如果您想在使当前会话无效后创建一个新会话,请使用:request.getSession(true)或更简单的:request.getSession()

于 2014-09-04T12:18:39.847 回答
1

我在7.0.82遇到了类似的问题。在7.0.57httpRequest.getSession(false)返回了一个会话(会话已经创建),但在 7.0.82 中,它返回了 null。绝对没有代码更改,只是升级了tomcat。

我可以通过手动添加 JsessionId cookie 来解决这个问题。

HttpSession session = request.getSession(false);
Cookie userCookie;
if (request.getParameter("JSESSIONID") != null) {
    userCookie = new Cookie("JSESSIONID", 
    request.getParameter("JSESSIONID"));
} else {
String sessionId = session.getId();
userCookie = new Cookie("JSESSIONID", sessionId);
}
response.addCookie(userCookie);
于 2017-10-30T11:49:00.163 回答