我编写了一个过滤器,它将使当前会话无效并创建新会话并将旧会话的属性复制到新会话中。
这在 tomcat5 和 jdk 1,4 中工作正常,但是当我将其切换到 tomcat6 和 jdk 1.6 时
一旦过滤器运行,然后处理下一个请求httprequest.getsession(false )
is 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 {
}
}
的 javadocHttpServletRequest.getSession(布尔创建) http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/http/HttpServletRequest.html#getSession(boolean)明确指出,如果您通过了false
value 到它的参数,它只会返回HttpSession
如果已经存在。如果没有与请求关联的会话,则会返回null
.
因此,如果您使当前会话无效,显然会调用request.getSession(false)
在您的下一个请求中将返回null
.
如果您想在使当前会话失效后创建一个新会话,请使用:request.getSession(true)
或者更简单地说:request.getSession()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)