0
@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],用户 bean 会很好地重新注入......但我不希望有那个中间步骤。有任何想法吗?

我尝试了各种形式,FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("user");希望它能从会话中重新拉出来,但无济于事。我不想在我的 LoginController 中紧密耦合代码来引用专门使 FooController 或 BarController 或任何其他引用用户 bean 的无效。

4

2 回答 2

0

为什么要从(当前会话中的对象映射)中删除user(a )?@SessionBeanviewMap@ViewScoped

您应该从, ie中删除FooController, the @ViewScoped, beanviewMap

FacesContext.getCurrentInstance().getViewRoot().getViewMap().remove("fooControl‌​ler");. 

这将摆脱 viewscoped bean 并强制创建一个新的。当然,无论如何,您都需要刷新页面。

但是,如果您打算删除会话 bean,则应该直接访问会话:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("user");.

这摆脱了用户对象

于 2013-11-26T21:55:23.360 回答
0

好的,我在开车回家时发现了这一点,这是一个生命周期问题。我试图让 JSF 做一些它不应该对托管 bean 做的事情。

我没有新建一个对象并将其重新分配给inUser的托管实例,而是将登录方法更改为如下所示:userLoginController

public String login() {
  //handle Servlet 3.0 based authenticate()... if success...
  User loadedFromDB = someDao.load(principal.getName());
  user.setDefaultPage(loadedFromDB.getDefaultPage());  // NOTE:  The user object IS THE MANAGED BEAN
  user.setDefaultScheme(loadedFromDB.getDefaultScheme());  //  This is the same object the view scoped bean has a ref on, so directly setting that object's fields proliferates that to any other bean that has the user in scope.
  ... //etc... not calling NEW, not reassigning object ref to user
  loadedFromDB = null;
  return "?faces-redirect=true";
}

这完成了所需要的。谁知道,如果您停止与框架抗争一分钟并使用它,它会帮助您:)

于 2013-11-27T15:48:32.993 回答