@SessionScoped public class User {
... //settings, attributes, etc
}
@ViewScoped public class FooController {
@ManagedProperty(value="#{user}")
private User user;
...
}
@RequestScoped public class LoginController {
@ManagedProperty(value="#{user}")
private User user;
public String login() {
//handle Servlet 3.0 based authenticate()... if success, make new User object and slap it into context
request.getSession().setAttribute("user", user);
return "?faces-redirect=true";
}
...
}
xhtml страницы содержат элементы управления входом практически на каждой странице. В идеале они могут войти в систему, и страница обновится, а существующий FooController
будет иметь ссылку на вошедшего в данный момент пользователя, который условно отображает кнопки/элементы. Поведение заключается в том, что происходит вход в систему, но представление FooController
все еще «действительно», поэтому управляемый компонент никогда не пытается быть введен снова. Если я перейду со страницы и вернусь на нее [воссоздание bean-компонента с областью видимости], пользовательский bean-компонент повторно вставляется красиво... но я бы предпочел не делать этого промежуточного шага. Есть идеи?
Я пробовал различные формы FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("user");
в надежде, что он повторно вытащит его из сеанса, но безрезультатно. Я не хочу тесно связывать код в моем LoginController, чтобы ссылаться на конкретную недействительность FooController или BarController или любого другого, который ссылается на пользовательский компонент.