1

webapp によってプログラムで登録された Jaspic/JSR196 モジュールを使用して、jsf Web アプリケーションを開発しました。

これを実現するために、次のブログの指示に従いました: http://arjan-tijms.blogspot.pt/

このソリューションは、ユーザーの認証に問題なく機能します。ユーザー名とパスワードを受け取り、request.authenticate メソッドを呼び出す Bean があります。要求はサーバー認証モジュール (SAM) で検証され、ユーザーは認証されます。

問題は、webapp での移動中にセッションが無効になることが多く、ユーザーがログイン ページにリダイレクトされることです。SAM モジュールの実装は、保護されたリソースへのアクセス中に request.getUserPrincipal が null を返すと、ユーザーをログイン ページにリダイレクトします。この動作のパターンは見つかりませんでした。

ログを分析しているときに、いくつかの例外がスローされることがわかりました: (これらの例外が Web ページに表示される場合があります)。

HttpSession が無効です

<Feb 26, 2013 5:13:30 PM GMT> <Error> <HTTP> <BEA-101020> <[ServletContext@1361767580[app:web-richfaces module:web-richfaces path:null spec-version:3.0]] Servlet failed with an Exception
java.lang.IllegalStateException: HttpSession is invalid
at weblogic.servlet.internal.session.SessionData.isNew(SessionData.java:891)
at weblogic.servlet.security.internal.SecurityModule.login(SecurityModule.java:252)
at weblogic.security.jaspic.servlet.JaspicSecurityModule.checkUserPerm(JaspicSecurityModule.java:85)
at weblogic.servlet.security.internal.SecurityModule.checkAccess(SecurityModule.java:95)
at weblogic.servlet.security.internal.SecurityModule.isAuthorized(SecurityModule.java:543)
at weblogic.servlet.security.internal.WebAppSecurity.checkAccess(WebAppSecurity.java:499)
at weblogic.servlet.security.internal.WebAppSecurity.checkAccess(WebAppSecurity.java:463)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2119)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1513)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)    

セッションの無効化が別のスレッドで進行中です

<Feb 26, 2013 5:16:12 PM GMT> <Error> <HTTP> <BEA-101020> <[ServletContext@1361767580[app:web-richfaces module:web-richfaces path:null spec-version:3.0]] Servlet failed with an Exception
    java.lang.IllegalStateException: Session invalidation is in progress with different thread
    at weblogic.servlet.internal.session.SessionData.invalidate(SessionData.java:880)
    at weblogic.servlet.internal.ServletRequestImpl$SessionHelper.updateSessionId(ServletRequestImpl.java:3215)
    at weblogic.servlet.internal.ServletObjectsFacadeImpl.updateSessionId(ServletObjectsFacadeImpl.java:54)
    at weblogic.servlet.security.internal.SecurityModule.generateNewSession(SecurityModule.java:265)
    at weblogic.servlet.security.internal.SecurityModule.login(SecurityModule.java:253)
    at weblogic.security.jaspic.servlet.JaspicSecurityModule.checkUserPerm(JaspicSecurityModule.java:85)
    at weblogic.servlet.security.internal.SecurityModule.checkAccess(SecurityModule.java:95)
    at weblogic.servlet.security.internal.SecurityModule.isAuthorized(SecurityModule.java:543)
    at weblogic.servlet.security.internal.WebAppSecurity.checkAccess(WebAppSecurity.java:499)
    at weblogic.servlet.security.internal.WebAppSecurity.checkAccess(WebAppSecurity.java:463)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2119)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1513)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

応答はすでにコミットされています

<Feb 26, 2013 5:06:16 PM GMT> <Error> <HTTP> <BEA-101020> <[ServletContext@1361767580[app:web-richfaces module:web-richfaces path:null spec-version:3.0]] Servlet failed with an Exception
java.lang.IllegalStateException: Response already committed
at weblogic.servlet.internal.ServletResponseImpl.objectIfCommitted(ServletResponseImpl.java:1651)
at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:658)
at weblogic.security.jaspic.servlet.JaspicSecurityModule.checkUserPerm(JaspicSecurityModule.java:87)
at weblogic.servlet.security.internal.SecurityModule.checkAccess(SecurityModule.java:95)
at weblogic.servlet.security.internal.SecurityModule.isAuthorized(SecurityModule.java:543)
at weblogic.servlet.security.internal.WebAppSecurity.checkAccess(WebAppSecurity.java:499)
at weblogic.servlet.security.internal.WebAppSecurity.checkAccess(WebAppSecurity.java:463)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2119)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1513)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)

次のログ エントリは、有効なセッションが見つからないため、ユーザーがログイン ページにリダイレクトされることを示しています。

<HttpRequest@207744527 - /prototype-web-richfaces/pages/customer/customer.jsf: SessionID: MmGLRsrCKrVs2ms2ZYcJbxB1LLngk7pZcjPP4Fd071b1JJLPyLTg!1600091307 found in cookie header>
<HttpRequest@207744527 - /prototype-web-richfaces/pages/customer/customer.jsf: SessionID= MmGLRsrCKrVs2ms2ZYcJbxB1LLngk7pZcjPP4Fd071b1JJLPyLTg found for WASC=ServletContext@1361767580[app:web-richfaces module:web-richfaces path:/prototype-web-richfaces spec-version:3.0]>
<HttpRequest@207744527 - /prototype-web-richfaces/pages/customer/customer.jsf: Trying to find session: MmGLRsrCKrVs2ms2ZYcJbxB1LLngk7pZcjPP4Fd071b1JJLPyLTg!1600091307>
<HttpRequest@207744527 - /prototype-web-richfaces/pages/customer/customer.jsf: Trying other contexts to find valid session for id: MmGLRsrCKrVs2ms2ZYcJbxB1LLngk7pZcjPP4Fd071b1JJLPyLTg!1600091307>
<HttpRequest@207744527 - /prototype-web-richfaces/pages/customer/customer.jsf: Couldn't find valid session for id: MmGLRsrCKrVs2ms2ZYcJbxB1LLngk7pZcjPP4Fd071b1JJLPyLTg!1600091307>
[[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'] INFO authentication.jaspic.TestServerAuthModule - Request URI: /prototype-web-richfaces/pages/customer/customer.jsf
[[ACTIVE] ExecuteThread: '6' for queue: 'weblogic.kernel.Default (self-tuning)'] DEBUG authentication.jaspic.TestServerAuthModule - Principal is null. Redirecting to login page.

コンテナーが Http セッションを無効にしているようです。しかし、私たちはその理由を理解できません。何か助けはありますか?

4

1 に答える 1

2

Lan の質問に追加します。どのバージョンの WebLogic を使用していますか? また、認証していない場合、これらのセッションの問題もありますか?

また、WebLogic で実行しているアプリケーションは 1 つだけですか、それとも複数ありますか? このブログでは、登録時の「null」回避策について言及していることに注意してください。このアプローチに正確に従った場合、その WebLogic インスタンスで実行されているすべてのアプリのモジュールを登録します。server [space] [context path]または、パターンを試すこともできます"server /prototype-web-richfaces"(ブログ投稿のステップ 10 の表を参照)。Java EE 7 の JASPIC MR はこれを修正することに注意してください。

呼び出している場合はrequest.authenticate、SAM が要求の途中で呼び出されることに注意してください (保護されたリソースを要求しているだけの場合は、要求の最初に呼び出されます)。新しいセッションを作成しようとしていて、request.authenticate. 通常、JSF アクション メソッドは機能しますが、インストールしたサーブレット フィルターがその前に何かを書き込む可能性があることに注意してください。

「レスポンスが既にコミットされています」の場合、WebLogic がエラー ページを送信しようとしているように見えますが、レスポンスに既に何かが書き込まれているため、そのページを送信できません。その根本的なエラーが何であるかを確認したい場合があります。

OmniFaces プロジェクト (実際には OmniSecurity サブプロジェクト) 用にSAM を作成しました。これは別の例になるかもしれません。残念ながら、その特定の SAM は少し複雑なので、学ぶのに最適な例ではないかもしれませんが、実際のアプリケーションで使用されていることを確認したい場合は、. その例もあります(特にWebLogic 12cでこれをテストしました)。

于 2013-03-20T12:00:36.080 に答える