2017-09-08 18 views
0

最近jetty 9.3.11から9.4.6にアップグレードしました。 9.4.xはHashSessionManagerをサポートしていないので、独自のカスタムSessionHandlerを作成しました。しかし、このSessionHandlerをWebAppContextに接続すると、サーブレットからアクセスしようとするとコンテキストがnullになります。ログにエラーがスローされません。jetty 9.4異なるコンテキスト間でセッションを共有

コードの関連セクション:私のカスタムセッションハンドラの

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

私はセッションが作成されたかどうかを確認するために、すべてのコンテキストをループしSessionHandlerののgetSession()関数を拡張(「/」)ルートへのクッキーのパスを設定

  1. によって

  2. それを解決他のコンテキストでのCookieの場合

    /*セッションのすべてのコンテキストをチェックする*/

    公開セッションのgetSession(文字列ID) {セッションセッション= getLocalSession(ID)。 場合(セッション== nullの)ため { (。SessionHandlerマネージャー:getSessionIdManager()getSessionHandlers()){ 場合(!manager.equals(この)|| CustomSessionHandlerのinstanceof(マネージャー)) { 続けます。 } セッション=((CustomSessionHandler)マネージャ).getLocalSession(id); if(session!= null) { break; } } //各コンテキストでセッションを複製する必要がありますか? //セッションが一貫しない場合がありますか? /* (externalSession = nullで!)であれば { が { getSessionCacheを(してみてください)(ID、externalSession)を置きます。 } catch(例外e) { LOG.warn( "セッションをローカルキャッシュに保存できません。 }} * /}

    return session; 
    

    }

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

    • 既知の既存のセッションを取得する
    • @param id任意のワーカー名を取り除いたセッションID。セッション@return
    • かが存在しない場合はnullを返します。 */ 公開セッションgetLocalSession(文字列ID) {戻りsuper.getSession(ID)。 }
関連する問題