向Wicket会话添加属性

时间:2015-07-01 14:51:12

标签: java session wicket

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属性?

2 个答案:

答案 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();
}