我有一个使用JSF 1.1的小应用程序。它使用NTLM进行身份验证。
什么是最好的方法来存储已登录的user_id,以便可以在所有java类的应用程序中使用,user_id将被用于几乎所有jsf页面对应的java类。
任何帮助我都非常感激。
谢谢
将其存储在web会话中:
session=FacesContext.getExternalContext().getSession();
session.setAttribute("user_id",user_id);
这取决于您如何执行身份验证。如果您通过使用FORM、BASIC或DIGEST身份验证将身份验证过程委托给容器,那么您可以使用以下代码片段获得与当前请求关联的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对象与用户与应用程序的会话具有相同的生存期。