2014-09-04 1 views
1

Я написал один фильтр, который аннулирует текущий сеанс и создаст новый сеанс и скопирует атрибуты старой сессии в новый сеанс. Это хорошо работает в tomcat5 и jdk 1,4, но когда я переключил его на tomcat6 и jdk 1.6 после того, как фильтр работает, то для следующего запроса httprequest.getsession(false) - null. Почему он ведет себя по-другому в tomcat 6. Пожалуйста, помогите. вот фрагмент кодаhttprequest.getsession возвращает null

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 { 


    } 

}   

ответ

2

Javadoc из HttpServletRequest.getSession(boolean create) ясно говорится, что если вы передаете значение false его параметра, он будет возвращать только HttpSession если есть один существующий уже. Если сеанс не связан с запросом, он вернет null.

Итак, если вы аннулируете текущую сессию, очевидно, что вызов request.getSession(false) в следующем запросе будет возвращен null.

Если вы хотите создать новый сеанс после недействительности текущего, используйте: request.getSession(true) или более просто: request.getSession().

+0

после аннулирования его. Я создаю новую сессию – aru

+0

и копирую старые атрибуты в новый сеанс. Смотрите приведенный выше код. Я создал файл только для входа в систему. код хорошо работает в tomcat 5, но в tomcat 6 его сеанс настройки null после того, как фильтр выполнен, и он потерял все содержимое. – aru

+0

Вы пытались использовать 'request.getSession()' вместо 'request.getSession (true)'? – icza

0

Я столкнулся с аналогичной проблемой в 7.0.82. В 7.0.57httpRequest.getSession(false) вернул сеанс (сеанс уже был создан), но в 7.0.82 он возвращал значение null. Абсолютно без изменения кода, только tomcat был обновлен.

Я смог решить эту проблему, добавив файл cookie JsessionId вручную.

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); 
Смежные вопросы