WebSession有一个实现,它应该存储已登录用户的ID:
public class SecurityWebSession extends AuthenticatedWebSession {
public SecurityWebSession(Request request) {
super(request);
bind();
}
...
@Override
public boolean authenticate(String username, String password) {
user = usersFacadeLocal.findByEmail(username);
if (user != null) {
try {
boolean valid = PasswordHash.validatePassword(password, user.getPassword());
if (valid) {
WebSession.get().setAttribute(USER_ID, user.getId());
}
return valid;
} catch (Exception ex) {
logger.error("Authenticate ERROR", ex);
}
}
return false;
}
}
但是,当我从WebPage类访问SecurityWebSession以获取已登录用户的ID时,它将返回null。我发现Session没有存储从其正文中添加的值。但是,如果从Wicket的WebPage继承的类中设置它,它就能完美地存储值。
我在文档中没有找到任何关于这种情况的提及。如何从Session添加Session属性?
答案 0 :(得分:4)
你偶然使用Wicket 6.19.0吗? 如果是这种情况,那么您点击https://issues.apache.org/jira/browse/WICKET-5845。它在6.20.0中修复 如果不是这种情况,请使用快速入门应用程序创建一个显示问题的新票证。谢谢!
答案 1 :(得分:0)
我想问题出在AuthenticatedWebSession.signIn(final String username, final String password)
。
这个方法会调用您的authenticate
方法,并会再次destroy()
和bind()
您的会话(这样做是为了避免会话固定)。
但是,您可以通过覆盖replaceSession()
暂时存储所需的值:
// this will be called *after* a successful authenticate
@Override
public void replaceSession() {
//temp store any values you want to carry over to the new session...
super.replaceSession();
//reset them to the session after super.replaceSession();
}