【问题标题】:Prevent creation of SessionScoped beans if not used如果不使用,则阻止创建 SessionScoped bean
【发布时间】:2013-01-08 12:45:38
【问题描述】:

我的应用主页上有以下sn-p:

<h:panelGroup rendered="#{loginBean.loggedIn}">
    <p>Welcome, #{loginBean.currentUser.firstName}</p>
</h:panelGroup>

LoginBean 是@SessionScoped。由于它是在主页上引用的,因此在页面加载时会创建一个相同的实例。

现在,假设用户从未登录。在这种情况下,我的 LoginBean 没有用,因为它不会保存有关用户的任何信息。这不是多余的吗?

并不是说这会导致问题,只是想知道不必要的实例化会占用内存空间。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    使#{loginBean} 请求/视图范围,并在成功登录时手动将用户置于会话范围内。会话范围可通过ExternalContext#getSessionMap() 以地图形式提供。

    @ManagedBean
    @ViewScoped
    public class LoginBean {
    
        public void login() {
            // ...
    
            if (user != null) {
                externalContext.getSessionMap().put("user", user);
            }
    
            // ...
        }
    
    }
    

    这样你就可以逍遥法外了

    <h:panelGroup rendered="#{not empty user}">
        <p>Welcome, #{user.firstName}</p>
    </h:panelGroup>
    

    另见:

    【讨论】:

    • 很好.. 谢谢 :) 关于基于容器的身份验证,Tomcat 7 是否支持?我遇到了这个链接:tomcat.apache.org/tomcat-7.0-doc/realm-howto.html。我可以按照此链接中提到的步骤进行相同的操作(使用 JDBCRealm)吗?
    • 是的,基本上是一样的。使用 realm,您基本上可以为容器管理的身份验证配置一个用户/角色数据库。然后由&lt;security-constraint&gt;web.xml 中进一步配置容器管理的身份验证。另请参阅stackoverflow.com/a/6079648
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2017-06-29
    • 1970-01-01
    • 2011-03-23
    • 2020-03-11
    • 2014-10-24
    • 2020-03-02
    相关资源
    最近更新 更多