使用Jaspic/JSR196模块的weblogic中的会话无效



我们用一个Jaspic/JSR196模块开发了一个jsf web应用程序。

我们遵循以下博客中的说明来实现这一点:http://arjan-tijms.blogspot.pt/

该解决方案可以很好地对用户进行身份验证:我们有一个bean,它接收用户名和密码并调用请求。身份验证方法。请求在服务器身份验证模块(Server Authentication Module, SAM)中被验证,用户被验证。

问题是,当在web应用中导航时,会话似乎经常无效,这使得用户被重定向到登录页面。当请求时,SAM模块实现将用户重定向到登录页面。getUserPrincipal在访问受保护的资源时返回null。我们没有发现这种行为的模式。

在分析日志时,我们发现了一些抛出的异常:(有时这些异常会显示在网页上。)

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会话无效。但我们不明白为什么。任何帮助吗?

添加到Lan的问题;你使用的是什么版本的WebLogic ?如果不进行身份验证,也会有这些会话问题吗?

另外,您在WebLogic上运行的应用程序是一个还是多个?请注意,博客在注册时提到了"null"解决方案;如果您完全遵循这种方法,您将为在该WebLogic实例上运行的所有应用程序注册模块。或者,您可以尝试模式server [space] [context path],例如"server /prototype-web-richfaces"(参见博客文章的步骤10中的表)。请注意,Java EE 7的JASPIC MR修复了这个问题。

如果你正在调用request.authenticate,意识到你的SAM将在请求的中间被调用(如果你只是请求一个受保护的资源,它将在请求的开始被调用)。如果您正在尝试创建一个新会话并使用request.authenticate,请注意您还没有向响应写入任何内容。JSF操作方法通常是有效的,但是要小心您所安装的任何Servlet Filters,它们可能会在此之前编写一些内容。

在"Response already committed"的情况下,看起来WebLogic正在尝试发送一个错误页面,但是这个页面不能被发送,因为一些东西已经被写到了响应中。你可能想检查一下这个根错误是什么。

对于OmniFaces项目(实际上是omnissecurity子项目),我们已经创建了一个SAM,它可能会给您提供另一个示例。不幸的是,这个特定的SAM有点复杂,所以它可能不是学习的最佳示例,但是如果您想看到它在实际应用程序中被使用;这里也有一个例子(我已经在WebLogic 12c等上测试过了)

相关内容

  • 没有找到相关文章

最新更新