httprequest.getsession ist die Rückgabe null
Ich geschrieben habe, einen filter, der ungültig die aktuelle Sitzung und Sie neue Sitzung anlegen und kopieren von Attributen der alten session in die neue session.
Das ist in Ordnung, die in tomcat5 und jdk 1,4, aber wenn ich wechselte es zu tomcat6 und jdk 1.6
sobald der filter läuft, dann für die nächste Anfrage httprequest.getsession(false )
ist null
. Warum deren Verhalten anders als in tomcat 6 .
Bitte helfen Sie.
hier ist der code-snippet
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 {
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der javadoc von HttpServletRequest.getSession(boolean create) klar, dass, wenn Sie übergeben eine
false
Wert der parameter, es wird nur die Rückkehr desHttpSession
wenn eine solche existiert bereits. Wenn es keine Sitzung, verbunden mit der bitte, es zurücknull
.Also, wenn Sie ungültig Ihre aktuelle Sitzung, offensichtlich Aufruf
request.getSession(false)
bei Ihrer nächsten Anfrage zurücknull
.Wenn Sie möchten, erstellen Sie eine neue Sitzung nach der ungültig die aktuelle, dann verwenden:
request.getSession(true)
oder mehr einfach:request.getSession()
.request.getSession()
stattrequest.getSession(true)
?Stand ich vor einem ähnlichen Problem in 7.0.82. In 7.0.57 die
httpRequest.getSession(false)
kehrte eine Sitzung (die Sitzung bereits angelegt wurde), aber in 7.0.82, es war null zurückgeben. Es wurde kein code geändert, nur der tomcat aktualisiert wurde.War ich in der Lage, diese zu lösen, indem die JsessionId cookie manuell.
request.getSession(false)
null zurückgeben kann, so dass Ihre Lösung kann eine nullPointerException werfen