生成大量会话的CDI SessionScoped Bean



我正在登录。问题是:我的isUserLoggedIn()方法被其他会话调用了几次(我已经检查了使用(HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false))。

(JSF页面的)Login bean是这样的:
@Named
@SessionScoped
public class Login implements Serializable {
    @Inject
    private Credentials credentials;
    private UserData user;
    public String login() {
        if (this.credentials.getUsername().equals("daniel")) {
            user = new UserData("Daniel");
            return "success";
        }
        return "failure";
    }
    public boolean isUserLoggedIn() {
        return user != null;
    }
    public String logout() {
        user = null;
        ((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false)).invalidate();
        return "success";
    }
    public String getUsername() {
        return getUser() == null ? "" : getUser().getUsername();
    }
    @Produces
    public UserData getUser() {
        return user;
    }
}

所以,发生的事情是:当login()被调用时,我可以通过getSession()看到它是X,但是,之后在尝试访问另一个页面时,当调用isUserLoggedIn()时,getSession()方法返回Y而不是X,并且用户属性为空。通常,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>

任何想法?谢谢你。

回到那里一段时间后,我发现问题与url路径有关。cookie是为一个路径生成的,当更改路径并尝试访问会话时,它会生成另一个路径。

无论如何,我发现这绝对不是保护Java EE应用程序的方法(参见Java EE 6手册),所以我要走另一条路。

谢谢。

相关内容

  • 没有找到相关文章

最新更新