我是从 Rails 和 PHP 转到 Java 的,所以我在这里的想法可能有问题。 我想实现一个类似于我在其他系统中所做的登录系统(我知道您可以使用 Java EE 的内置属性管理登录等,我只是想了解如何手动执行此操作并在其中共享对象 bean 。)
使用 rails 或 php 很容易维护一个保存登录用户 ID 的 session 变量。然后 PHP 中的全局变量或 rails 中 applicationController 上的属性可以与用户对象一起预加载,使其在所有 Controller /页面中可用。这样,所有页面/ Controller 都可以轻松访问用户的登录状态和其他参数。
我不知道如何使用 JSF 做类似的事情。
我知道如何使用 JPA 构建用户对象,然后在使用登录表单的登录方法登录后创建一个具有 session 范围的托管 bean,该 bean 保存对用户对象的引用。我理解的那部分:
@ManagedBean
@SessionScope
public class LogginController {
// inject persistence context, or use EJB to do actual loading etc
private User currentUser; //JPA Entity
void loginAction() {
// action from login form
// authenticates user and loads user object into currentUser property
我被卡住的地方是,虽然包含 currentUser 属性的托管 bean 具有 session 范围,但我如何访问其他托管 bean 中的该属性以获取当前用户?托管 bean 似乎彼此隔离存在。
下面的代码可以接受吗?
@ManagedBean
public class SomeOtherBean {
@ManagedProperty
LoginController loginController;
public void someOtherMethod() {
User myUser = loginController.getCurrentUser();
//
// etc
注入(inject) bean 的类是否也必须具有 SessionScope? 这是错误的方法吗,我是否需要使用底层 ServletContext 手动设置 session ,以便可以在其他 bean 中访问用户(即在 session 中保存登录用户的 ID,然后在访问用户后重新加载用户不同 bean 中的 id session 变量)?
我是不是做错了?有没有我想念的更简单的方法。
最佳答案
Is the following code acceptable?
是的(假设它是伪造的;在真实代码中它应该是一个private
属性并且您应该像这样指定托管属性值@ManagedProperty("#{loginController}")
并至少提供一个 setter 方法)。
Would the class having the bean injected also have to have SessionScope too?
不一定。它可以完全是一个请求或 View 作用域的 bean,但不是应用程序作用域的 bean(它会导致异常)。至少,您应该非常小心地选择 bean 作用域。不要为其包含的数据选择太广泛的范围。另见 How to choose the right bean scope? .
关于java - JSF 2.0 管理用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9343097/