0

假设我没有任何“密码保护”页面,但有时需要知道哪个用户点击了一些 jsf 按钮,以下是否可以,或者我也应该使用 HttpServletRequest.login()

一些处理登录的托管bean:

public void login(String name, String password) {
    try { 
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        MyUser user = userEjb.login(name, password);
        request.getSession().setAttribute("user", user);
    } catch {
    //login failed message..

    }
}

h:commandButton 调用的方法:

public void doSomething() {
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        MyUser user = request.getSession().getAttribute("user");
        //Is the user object 'safe' here?
}
4

1 回答 1

1

这个想法没有任何问题,假设您的login操作在登录时被调用并且另一个片段是在按钮按下时,但我会小心放置在会话中的内容。

例如,如果密码保留在您的MyUser班级中,您不希望将其存储在会话中。之所以?可以从服务器浏览会话,因此可以访问您系统的恶意/爱管闲事的人可以看到未加密的密码。

此外,如果有人不小心将用户对象转储到网页,或者它在错误中泄漏,会发生什么?

因此,鉴于上述基于偏执狂的独白,我的建议是存储一个与您的MyUser对象等效的视图 bean,该对象仅包含最少的字段(用户名,名称)以供您的应用程序使用,例如,最后由字段修改等。

于 2013-04-30T18:21:36.490 回答