我正在开发一个基于JSF Web的应用程序,它使用CDI托管bean和Shiro托管会话。我遇到的问题是抛出一个引用注释了@javax.enterprise.context.SessionScoped
的对象的JSF页面和一个UnknownSessionException。我已将日志记录级别设置为最佳并查看应用程序服务器日志文件我可以看到,当用户访问登录页面时,将创建一个新会话以及将JSESSIONID设置为b2b69494-2236-467f-9e0b-3c262c74b7c4的cookie。当用户访问引用SessionScoped bean的页面时,cookie将更新为JSESSIONID设置为49253beaee601d4107cba4b61c77,此时将抛出UnknownSessionException。访问引用使用@javax.enterprise.context.ApplicationScoped
或@javax.faces.view.ViewScoped
注释的托管bean的页面时,一切正常。
当访问引用会话范围bean的页面时,servlet容器似乎正在创建新会话,而不是允许使用Shiro托管会话。如果我将Shiro配置为使用除JSESSIONID以外的其他内容,则不会抛出错误,而是会创建两个会话,一个由Shiro管理,另一个由servlet容器管理。
我的shiro.ini文件的内容是
[main]
authc.loginUrl = /login.xhtml
authc.usernameParam = login:username
authc.passwordParam = login:password
authc.rememberMeParam = login:rememberMe
user.loginUrl = /login.xhtml
authc.successUrl = /app/index.xhtml
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
securityManager.sessionManager = $sessionManager
[users]
admin = password
[urls]
/login.xhtml = authc
/app/** = user
我的环境使用Glassfish 4.1,Java EE版本7,Mojarra版本2.2.7用于JSF,Weld版本2.2.2用于CDI,以及Shiro版本1.2.3。我还在Glassfish 4.0版上重现了同样的问题,尽管早期版本的Mojarra和Weld。
我已将应用程序服务器日志的相关部分上传到PasteBin,可以使用URL http://pastebin.com/2sPHfdTQ访问该部分 我还创建了一个示例Maven项目来演示这个问题。可以从https://www.dropbox.com/s/1x9pe2o9ja0q9jw/TestJavaEE-web.zip?dl=0下载示例项目,其中包含源代码和编译的war文件。
当前是否有其他人正在使用带有Shiro托管会话的CDI托管会话作用域bean,如果有,您是否遇到过任何问题?
我是否在Shiro或GlassFish中错过了配置设置或者这是一个错误?
注意:我之前在Shiro邮件列表上发布了这个问题,但我还没有找到解决方案,我希望StackOverflow上有更广泛的受众。