1

我们如何在 JSF 1.2 中处理会话变量(添加/获取)?

一个场景:考虑一个用户成功登录的登录屏幕,用户模型存储在会话中。用户模式包含用户角色。下一次,对于每个用户操作,检查用户模型中的用户角色并相应地显示表单。在这种情况下,如何在会话中添加用户 odel 以及如何每次从会话中获取它?

以前我在 Struts 1.2 中工作过,在该execute方法中,我们有一个requeste= 用于获取会话并访问会话变量。但我不确定如何在 JSF 1.2 中实现相同的目标。

唯一可行的方法是将托管 bean 添加到 faces-config.xml 文件的会话范围内吗?

请帮助我了解 JSF 1.2 中的会话处理概念。

4

2 回答 2

2

我认为您可以为这种机制使用Java EE 过滤器。

过滤器由 Servlet 容器控制,并根据your web.xml顺序首先在操作上运行。

将 servlet 过滤器添加到您的项目中。

public class YourFilter implements Filter {

public static final String USER = "USER_SESSION_KEY";

public void doFilter(ServletRequest req, ServletResponse response, FilterChain filterChain)
{

   HttpServletRequest request = (HttpServletRequest) req;
   HttpSession session = request.getSession(true);
       String servletpath = request.getServletPath();
if(!servletpath.contains("login.xhtml")) //exclude your login page and other pages required to pass this filter.
{
     if (session.getAttribute(USER) != null)
    {
    //Control your authentication and roles.
    }
    else
    {
    //There is no user in the session.
    }
}


    }
    filterChain.doFilter(request, response);
    }

将您的过滤器添加到您的 web.xml

<filter>
    <filter-name>YourFilter</filter-name>
    <filter-class>Package.YourFilter</filter-class>
</filter>
  <filter-mapping>
    <filter-name>YourFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>

其次,将您的 User 类放到 JSF 操作中的会话中。

public void userAction()
{


 User user = new User();
   //Build your User Class
  HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    request.getSession(false).setAttribute("USER", user);

}

PS:用户类是用户定义的POJO类。你应该根据你的需要来实现它。

public class User
{
    private String username;
       //Other properties and getter setter methods required.

}

如果你想在 JSF 上下文中实现这个机制。您可以通过实现JSF 阶段侦听器来构建相同的逻辑。

于 2013-05-02T07:09:02.267 回答
2

会话范围以编程方式提供ExternalContext#getSessionMap()HttpSession#get/setAttribute().

Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
// ...

当然,您也可以将托管 bean 放在会话范围内。它可以通过其他托管 bean 访问<managed-property>(或者只是使用托管 bean 名称作为映射键遍历会话映射)。

于 2013-05-02T01:49:52.553 回答