【问题标题】:How to keep current language when invalide session in wicket当检票口中的会话无效时如何保持当前语言
【发布时间】:2015-05-20 09:02:54
【问题描述】:

我的应用程序支持的不仅仅是语言。问题是当用户注销时(这意味着我打电话给getSession().invalidate())然后当前语言丢失并且使用默认语言创建了新会话。

语言是通过链接设置的:

add(new Link<Void>("goSk") {

    private static final long serialVersionUID = 1L;

    @Override
    public void onClick() {
        getSession().setLocale(new Locale("sk", "SK"));
    }
});

add(new Link<Void>("goEn") {

    private static final long serialVersionUID = 1L;

    @Override
    public void onClick() {
        getSession().setLocale(Locale.US);
    }
});

所以问题是当我使会话无效时我应该如何保持当前语言

【问题讨论】:

  • 您是否考虑过将您的用户偏好保存在数据库中?
  • 是的,但这是我要避免的选项,因为当用户注销时,没有用户,我认为 wicket 支持某种方式,如何通过无效会话保留一些东西
  • 原则上您需要启动一个新会话(使用“公共用户”主体),将语言环境作为参数传递给新会话开始的公共页面。

标签: java wicket


【解决方案1】:

最好为匿名用户使用 Cookie。 在无效之前将语言保存在 cookie 中。如果没有用户,在 YourSession#getLocale() 中使用 cookie。

【讨论】:

  • 我不确定但无效也删除cookies
  • 它会删除会话 cookie,但不会删除任何自定义 cookie。
  • 我也建议您采用此解决方案。它还可以在您的 PageParameters 中节省大量混乱。
【解决方案2】:

编辑:使会话无效不允许重置会话中的参数。 我成功测试的一个可行的解决方案是使用 PageParameters

Locale currentLocale=getSession().getLocale();
session.invalidate();//clear all session data
PageParameters pp=new PageParameters();
pp.add("locale", currentLocale.getLanguage());
setResponsePage(<you class>.class,pp);

并且在您在 setResponsePage 中指定的页面中,您必须提供一个带有 PageParameters 之类的构造函数

 public class Login extends BasePage {
    public Login(PageParameters pp) {
        //your code here
        logger.debug("login user"+pp.getString("locale"));
    }

Wicket 通过查询字符串传递参数 我用一个有效的测试用例尝试了这个

【讨论】:

  • 是的,我尝试了这个,但它不起作用,因为 invalidate 只是设置了一些参数以在下一个请求时使会话无效,然后创建了全新的会话
  • 但我为什么要立即使会话无效? PS:它仍然无法正常工作,因为在无效或无效之后,仍然存在通过 AuthenticatedWebApplication 类中的 newSession 创建全新的会话
  • 我没有尝试使用测试用例,但我认为因为您可以重新设置语言环境而不会在下一次请求时丢失它
  • 你是 rigth invalidate 不允许重用会话参数,我找到了 PageParameters 的解决方案
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2013-06-13
  • 2014-08-11
相关资源
最近更新 更多