JSF HttpSession 属性在 refresh/redirection 后变为空
JSF HttpSession attribute becomes null after refresh/redirection
我正在测试使用 httpsession 的简单登录,所以在我对用户进行身份验证后,我将用户属性添加到 http 会话:
@ManagedBean
@SessionScoped
public class loginView {
....
public String connect() {
FacesContext context = FacesContext.getCurrentInstance();
if (authenticated) {
context.getExternalContext().getSessionMap().put("user", login);
return "/home/NewFile?faces-redirect=true";
} else {
context.addMessage(null, new FacesMessage("Unknown login, try again"));
login = "";
pwd = "";
return null;
}
}
}
当我从登录视图调用此函数时,它会按预期重定向到 NewFile.xhtml
。在上述 xhtml 中,我使用 #{user}
显示 "user"
属性。到目前为止一切正常,但是当我刷新页面 (NewFile.xhtml
) 或当我重定向到另一个页面并尝试显示 "user"
属性时我得到 null,这是预期的行为吗?刷新或重定向会创建另一个 httpsession 吗?还是只是删除了我添加的属性?
经过一些研究,我成功地解决了我的问题,事实证明这只是我的一个愚蠢的错误。所以我想我应该在这里留下答案而不是删除问题。所以这里是:
环顾四周后,我发现这与 cookie 有关,所以我确实使用 chrome 的 F12 跟踪 HTTP 流量,并且每次我 refresh/navigate 时服务器都会发送新的 cookie .经过更多的搜索和测试,我发现了导致会话无效的原因,所以我以这种方式调用注销函数(使会话无效): <h:button outcome="view.logout()"/>
结果 outcome
执行加载页面之前的功能,所以我不得不将其更改为 <p:commandButton action="view.logout()"/>
我正在测试使用 httpsession 的简单登录,所以在我对用户进行身份验证后,我将用户属性添加到 http 会话:
@ManagedBean
@SessionScoped
public class loginView {
....
public String connect() {
FacesContext context = FacesContext.getCurrentInstance();
if (authenticated) {
context.getExternalContext().getSessionMap().put("user", login);
return "/home/NewFile?faces-redirect=true";
} else {
context.addMessage(null, new FacesMessage("Unknown login, try again"));
login = "";
pwd = "";
return null;
}
}
}
当我从登录视图调用此函数时,它会按预期重定向到 NewFile.xhtml
。在上述 xhtml 中,我使用 #{user}
显示 "user"
属性。到目前为止一切正常,但是当我刷新页面 (NewFile.xhtml
) 或当我重定向到另一个页面并尝试显示 "user"
属性时我得到 null,这是预期的行为吗?刷新或重定向会创建另一个 httpsession 吗?还是只是删除了我添加的属性?
经过一些研究,我成功地解决了我的问题,事实证明这只是我的一个愚蠢的错误。所以我想我应该在这里留下答案而不是删除问题。所以这里是:
环顾四周后,我发现这与 cookie 有关,所以我确实使用 chrome 的 F12 跟踪 HTTP 流量,并且每次我 refresh/navigate 时服务器都会发送新的 cookie .经过更多的搜索和测试,我发现了导致会话无效的原因,所以我以这种方式调用注销函数(使会话无效): <h:button outcome="view.logout()"/>
结果 outcome
执行加载页面之前的功能,所以我不得不将其更改为 <p:commandButton action="view.logout()"/>