CDI SessionScoped Bean生成大量会话
我正在登录。问题是:其他会话多次调用了我的isUserLoggedIn()方法(我使用CDI SessionScoped Bean生成大量会话,session,jsf,cdi,session-scope,Session,Jsf,Cdi,Session Scope,我正在登录。问题是:其他会话多次调用了我的isUserLoggedIn()方法(我使用 (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false)) (JSF页面的)登录bean如下: 因此,发生的情况是:当调用login()时,我可以通过getSession()看到它是X,但随后在尝试访问另一个页面时,当调用isUserLoggedIn()时,getSession()方法返回Y而不是
(HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false)
)
(JSF页面的)登录bean如下:
因此,发生的情况是:当调用login()时,我可以通过getSession()看到它是X,但随后在尝试访问另一个页面时,当调用isUserLoggedIn()时,getSession()方法返回Y而不是X,并且user属性为null。通常,isUserLoggedIn()方法只需要一个请求就被调用多次,每次调用时它的会话都会发生变化
顺便说一下,我使用的是JBoss AS7 Final,我的faces-config.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-action>#{login.login}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/secured/home.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-action>#{login.login}</from-action>
<from-outcome>failure</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/*.xhtml</from-view-id>
<navigation-case>
<from-action>#{login.logout}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
</faces-config>
/login.xhtml
#{login.login}
成功
/secured/home.xhtml
#{login.login}
失败
/login.xhtml
/*.xhtml
#{login.logout}
成功
/login.xhtml
有什么想法吗?谢谢。回到那里一段时间后,我发现问题与url路径有关。cookie是为路径生成的,当更改路径并尝试访问会话时,它是为另一个路径生成的 无论如何,我发现这绝对不是保护JavaEE应用程序的方法(请参阅JavaEE6手册),所以我选择了另一种方法
谢谢。如果您自己不做一点调试工作,这个问题是无法回答的。关键的一点是,要么您的客户端不支持cookies,要么您正在根据每个请求重新创建会话。第一步是使用诸如Firebug之类的HTTP流量检查器检查会话cookie的情况。服务器是否在每个响应上返回新的
Set Cookie
?或者客户端是否拒绝在每次请求时返回Cookie
?这应该有助于锁定罪犯。谢谢你的回答,巴卢斯克。回到那里一段时间后,我发现问题与url路径有关。cookie是为路径生成的,当更改路径并尝试访问会话时,它是为另一个路径生成的。
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-action>#{login.login}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/secured/home.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-action>#{login.login}</from-action>
<from-outcome>failure</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/*.xhtml</from-view-id>
<navigation-case>
<from-action>#{login.logout}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
</faces-config>