我使用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。我想我可以像我期望的那样有大量的会话,所以我不清楚为什么在这种情况下我会有异常。我是不正确地将用户和会话关联起来,还是会出现其他导致异常的问题?
谢谢你,佐博
发布于 2016-10-11 06:17:40
在Chrome中,所有匿名会话共享同一个cookie jar。只有当所有匿名会话都被关闭时,它才会被摧毁。这意味着第二个匿名会话与其他匿名会话共享cookie。见1。
您可以在另一个浏览器中使用会话,也可以使用Firefox这样的浏览器进行多个私有会话,因为Firefox不共享这样的cookie。
https://stackoverflow.com/questions/39965507
复制相似问题