2012-03-25 13 views
10

Googleではこの問題の参照はたくさんありますが、答えは見つかりませんでした。私はjetty(8.1.2.v20120308)の最新バージョンを使用しています。セッションを使用できるように組み込みサーブレットを取得することはできません。この例はもちろんスカラーですが、どのJavaプログラマーにとっても読みやすいはずです。私のサーブレットコードで埋め込みJetty - IllegalStateException:いいえSessionManager

val server = new Server(); 
val connector = new SelectChannelConnector() 
connector.setPort(Integer.getInteger("jetty.port", 8080).intValue()) 
server.setConnectors(Array(connector)) 

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setContextPath("/") 
webapp.setResourceBase(webDir) 
webapp.setServer(server) 

val brzyServ = new ServletHolder(new BrzyDynamicServlet()) 
webapp.addServlet(brzyServ, "*.brzy") 

server.setHandler(webapp); 
server.start() 

... 
log.debug("session manager: {}",req.asInstanceOf[Request].getSessionManager) 
val session = req.getSession 
... 

req.getSessionは、この例外をスローし、その前にデバッグ行は、常にnullです。ログで

java.lang.IllegalStateException: No SessionManager 
at org.eclipse.jetty.server.Request.getSession(Request.java:1173) 

私はこの見ることができます:

DEBUG org.eclipse.jetty.server.session - ses[email protected]2a8ceeea 
DEBUG org.eclipse.jetty.server.session - session=null 

を、私はそれが関連するかどうか分からないが、セッションマネージャがあるように思われるが、それはリクエストに応じて利用できません。

WebAppContextでこれと同じ結果を試しました。明示的にセッションマネージャをダースに設定することは言うまでもありません。

答えて

11

私は問題はあなたがServletContextHandlerはなくWebappContext

[...]construction of a context with ServletHandler and optionally session and security handlers [...] 
ServletContextHandlerのJavaDocから

val webapp = new WebappContext(); 

または

val webapp = new ServletContextHandler(ServletContextHandler.SESSIONS) 
webapp.setSessionHandler(new SessionHandler()) 

を試してみてくださいをインスタンス化しているという事実から来ていると信じて

optionallyという単語がここにある可能性が高いです。

+0

おかげで、私は成功しません、両方のそれらの変種を試してみました。また、HashSessionManagerを明示的にSessionHandlerに追加しようとしましたが、何を試みてもJetty Request.getSession()は常にIllegalStateExceptionをスローします。 jettyからのログ出力には、セッションマネージャが存在することが示されています。要求には利用可能なように見えます。 –

+0

マイケルは、桟橋のコードを見て、私はこれが起こって見ることができる唯一の方法は、SessionHandlerは関連付けられていないと要求で初期化されます。 web.xmlに任意の種類の認証がありますか? –

+0

私は同じ問題を抱えていましたが、BGRの答えが少し変わったので、WebAppContextを作成せずにサーブレットコンテキストハンドラに新しいセッションハンドラを追加して正常に動作しました。 servletContextHandler.setSessionHandler(new SessionHandler()) –

0

私はちょっと愚かな気がします。この問題はサーブレット内にあり、要求がスコープ外になったときにセッションにアクセスした子スレッドのリクエストにアクセスしていました。エラーをグーグルで調べると、エラーメッセージが少し曖昧だったので、間違ったパスを送ってきました。返信のBGRに感謝します。桟橋9.4で

0

、servlethandlerのための非常にシンプルなセッションハンドラを有効にする:返信用

private static void setSessionEnableContext(Server server,ServletHandler handlerServlet) { 
     // Specify the Session ID Manager   
    SessionIdManager idmanager = new DefaultSessionIdManager(server); 
    server.setSessionIdManager(idmanager); 
    // Specify the session handler 
    SessionHandler sessionsHandler = new SessionHandler();  
    handlerServlet.setHandler(sessionsHandler);   
}