【问题标题】:session handling in JSF 1.2JSF 1.2 中的会话处理
【发布时间】:2013-04-25 11:17:21
【问题描述】:

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

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

以前我在 Struts 1.2 中工作,在 execute 方法中,我们有一个 request e=,它也用于获取会话并访问会话变量。但我不确定如何在 JSF 1.2 中实现同样的效果。

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

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

【问题讨论】:

  • 您为什么仍在使用 JSF 1.2?
  • @Lion 可能正在维护一个无法迁移到 JSF 2 的遗留应用程序。

标签: java jsf jsf-1.2


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我认为您可以将Java EE filters 用于此机制。

    过滤器由 Servlet Container 控制,并首先根据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);
    
    }
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2014-02-21
      • 2011-08-01
      • 2011-06-12
      • 2013-07-22
      • 2011-06-03
      相关资源
      最近更新 更多