jetty 9.4分享不同背景下的会话

时间:2017-09-08 03:19:41

标签: jetty

我最近从码头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中不适用于新的会话管理。

感谢您解决此问题的任何帮助。

1 个答案:

答案 0 :(得分:0)

我通过

解决了这个问题
  1. 将Cookie路径设置为root(" /")

  2. 扩展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;
    

    }

    / * --------------------------------------------- --------------- * /   / **

    • 获取已知的现有会话
    • @param id删除任何工作人员姓名的会话ID。
    • @return会话,如果不存在,则返回null。 * / public Session getLocalSession(String id) { return super.getSession(id); }