CDI SessionScoped Bean, генерирующий множество сессий - PullRequest
0 голосов
/ 23 августа 2011

Я делаю логин.Проблема в том, что мой метод isUserLoggedIn () вызывается несколько раз другими сеансами (я проверил, используя (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false)).

Компонент Login (на странице JSF) выглядит так:

@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, а мой Face-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>

Есть идеи?Спасибо.

1 Ответ

1 голос
/ 29 сентября 2011

Через некоторое время я обнаружил, что проблема связана с URL-путем. Файл cookie был сгенерирован для пути, и при изменении пути и попытке доступа к сеансу он был создан еще один.

Во всяком случае, я обнаружил, что это определенно НЕ способ защиты приложений Java EE (см. Руководство по Java EE 6), поэтому я иду другим путем.

Спасибо.

...