2011-07-20 34 views
0

我有使用JSF 1.1的小应用程序。它使用NTLM进行身份验证。存储登录用户ID的最佳方法

什么是最好的方法来存储登录user_id,以便可以在所有java类的应用程序中使用,user_id将用于几乎所有的jsf页面相应的java类。

任何帮助是非常可观的。

感谢

回答

1

其存储在Web会话:

session=FacesContext.getExternalContext().getSession(); 
session.setAttribute("user_id",user_id); 
+0

为了在需要将其写入数据库或用于任何其他目的的所有bean中调用此会话值,是否需要在我的应用程序中放入一些常用类,以便可以从任何地方引用它? – user75ponic

+0

是的,也许有一个Context类有一个静态方法getContextSession(),它会返回你的会话对象:Context.getContextSession() – othman

1

:这取决于你如何进行认证。如果要委托认证处理到容器上,通过使用FORM,基本或摘要验证,则可以得到用下面的代码片断当前请求相关联的Principal对象:

Principal user = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal(); 

用户的名称该领域可以使用user.getName()方法获得。在引擎盖下,容器将Principal对象存储在HttpSession实例中,但在大多数容器中,这不能作为使用HttpSession.getAttribute(...)方法的属性访问。

当调用EJB的业务方法时,Principal对象也会由Servlet容器自动传播到EJB容器,并且您可以使用SessionContext接口访问它。在EJB,您可以执行以下,以获得校长参考:

@Resource 
private SessionContext ctx; 

public void businessMethod() 
{ 
    Principal user = ctx.getCallerPrincipal(); 
    ... 
} 

如果不委托认证的容器,而是,你用你自己的方式进行身份验证,则必须成功验证后,将引用存储到HttpSession对象中的用户身份,并且您必须在会话失效时清除此内容。不建议将它存储在其他作用域中,因为只有HttpSession对象与用户与应用程序的会话具有相同的生命周期。

+0

我不会使用EJB的。你能否提供一些关于如何存储在HTTPSession对象上的示例? – user75ponic

+0

@Polappan,它在另一个答案中提供。 –