我使用sessionMap为我的JSF / Primefaces网站构建了一个简单的登录系统。在我的主视图中,ParliamentManager是一个SessionScoped bean我有:
@PostConstruct
public void postInit() {
logger.log(Level.INFO,"Session started");
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
user = (User) sessionMap.get("user");
logger.log(Level.INFO, "user trader is: {0}",
new Object[]{user.getTrader().getTraderId().toString()});
userId = user.getUserId();
在我的登录视图中,我有一个RequestScoped ManagedBean:
public void login(ActionEvent event) {
RequestContext requestContext = RequestContext.getCurrentInstance();
FacesContext context = FacesContext.getCurrentInstance();
boolean loggedIn = false;
User user = request.findUser(username);
if(user.getPassword().equals(this.getPassword()))
{
loggedIn = true;
context.getExternalContext().invalidateSession();
context.getExternalContext().getSession(true);
context.getExternalContext().getSessionMap().put("user", user);
logger.log(Level.INFO, "put user {0}",
new Object[]{user.getUserId()});
logger.log(Level.INFO, "session id {0}",
new Object[]{context.getExternalContext().getSessionId(false)});
requestContext.addCallbackParam("loggedIn", loggedIn);
}
}
在我的登录页面中,我只需重定向到主索引页面:
<script type="text/javascript">
function handleLoginRequest(xhr, status, args) {
if(args.validationFailed || !args.loggedIn) {
PF('dlg').jq.effect("shake", {times:5}, 100);
}
else {
PF('dlg').hide();
$('#loginLink').fadeOut();
window.location = "http://localhost:8080/mysite/index.xhtml"
}
}
如果我有两个用户登录(一个在浏览器会话中,另一个在隐身会话中),则此工作正常。但是,如果我添加第三个用户(另一个invognito会话),我在表单中提交我的ajax请求时会收到ViewExpiredException。我认为我可以有大量的会话,因为我期待很多用户,所以我不清楚为什么我在这些情况下得到例外。我是否错误地关联了用户和会话,或者是否存在导致异常的其他问题?
谢谢, Zobbo
答案 0 :(得分:0)
在Chrome中,所有隐身会话共享相同的Cookie jar。只有在所有隐身会话结束后才会销毁。这意味着第二个隐身会话与其他隐身会话共享Cookie。见[1]。
您可以在其他浏览器中使用会话,也可以使用Firefox等具有多个私人会话的浏览器,因为Firefox不会像这样共享Cookie。
[1] https://bugs.chromium.org/p/chromium/issues/detail?id=24690