我最近从码头9.3.11升级到9.4.6。由于9.4.x不支持HashSessionManager,因此我创建了自己的自定义SessionHandler。但是当我将此SessionHandler附加到WebAppContext时,当尝试从servlet访问时,上下文变为null。日志中没有抛出任何错误。
相关的代码部分:
MyCustomSessionHandler sessionHandler = new MyCustomSessionHandler();
HandlerCollection handlers_ = new HandlerCollection(true);
COntextHandlerCollection chc_ = new ContextHandlerCollection();
for(WebAppConfig wap: webAppConfigs) //webappconfig a POJO from where I am getting webapp configs
{
String path = wap.getPath();
String warFile = wap.getWarFile();
WebAppContext context =
new WebAppContext(chc_, warFile, path);
// context.setSessionHandler(new SessionHandler()); // this one works.
context.setSessionHandler(sessionHandler); // this one doesnt work.
for (ServletConfig servletConfig: wap.getServletConfigs()) //ServletConfig is another POJO to get servlet configs
{
String servletName = servletConfig.getName();
String servletPath = servletConfig.getPath();
Servlet servlet = servletConfig.getServlet();
ServletHolder servletHolder = new ServletHolder(servlet);
context.addServlet(servletHolder, servletPath);
}
}
handlers_.setHandlers(new Handler[] { chc_, new DefaultHandler()});
server_.setHandler(handlers_);
我的自定义会话处理程序的示例
public class MyCUstomSessionHandler extends SessionHandler
{
public MyCustomSessionHandler()
{
super();
}
public void setSecureCookies(boolean secureCookies)
{
getSessionCookieConfig().setSecure(secureCookies);
}
public void setHttpOnly(boolean httpOnly)
{
getSessionCookieConfig().setHttpOnly(httpOnly);
}
public void setMaxCookieAge(int age)
{
getSessionCookieConfig().setMaxAge(age);
}
}
进一步说明:这是因为我创建了一个单独的sessionhandler并在不同的WepAppContext中共享它作为在它们之间共享会话的方式。这种方法在9.3中没有问题似乎工作正常,但在9.4中不适用于新的会话管理。
感谢您解决此问题的任何帮助。
答案 0 :(得分:0)
我通过
解决了这个问题将Cookie路径设置为root(" /")
扩展SessionHandler的getSession()函数以遍历所有上下文,以检查是否在任何其他上下文中为cookie创建了会话。
/ *检查会话的所有上下文* /
public Session getSession(String id) { Session session = getLocalSession(id); if(session == null) { for(SessionHandler manager:getSessionIdManager()。getSessionHandlers()) { if(manager.equals(this)|| !(经理instanceof CustomSessionHandler)) { 继续; } session =((CustomSessionHandler)manager).getLocalSession(id); if(session!= null) { 打破; } } //我们应该在每个上下文中复制会话吗? //我们最终会遇到不一致的会话吗? / * if(externalSession!= null) { 尝试 { getSessionCache()。put(id,externalSession); } catch(例外e) { LOG.warn("无法将会话保存到本地缓存。"); } } * / }
return session;
}
/ * --------------------------------------------- --------------- * / / **