【问题标题】:SessionScoped not working GAE+Jersey+GuiceSessionScoped 不工作 GAE+Jersey+Guice
【发布时间】:2014-08-02 14:44:40
【问题描述】:

我有一个使用 Jersey (1.17) 和 Guice (3.0) 的 Java 项目。 SessionScoped bean 在本地开发中工作,但在 GAE 上部署时不起作用。问题是他们不保持会话状态。

在 web.xml 中启用会话:<sessions-enabled>true</sessions-enabled>

我的 Session bean (SessionService) 是:

@SessionScoped
public class SessionService implements Serializable {
    @Inject transient Logger log;
    private Locale locale = Locale.US;
    public synchronized Locale getLocale() { return locale; }
    public synchronized void setLocale(Locale locale) { this.locale = locale; }
}

它绑定到 ServletModule bind(SessionService.class).in(ServletScopes.SESSION); 中的 Session 范围

我使用它的控制器是:

@Path("/settings")  
public class SettingsController {
    @Inject SessionService sessionService;

    @GET
    @Path("/setLocale")
    public Object setLocale(@QueryParam("languageTag") String languageTag) {
        sessionService.setLocale(Locale.forLanguageTag(languageTag));
        return "OK";
    }

     @GET
    @Path("/getLocale")
    public Object getLocale() { return sessionService.getLocale().getLanguage(); }
}

使用本地开发服务器可以正常工作。当部署在 GAE (1.9.5) 上时,它会第一次设置语言环境,然后即使我一次又一次地调用 setLocale,它也会永远保持不变。为什么它不起作用?

奇怪的是,我找到了一种使它起作用的晦涩方法,但我不知道为什么它使它起作用。要让它运行,有必要在设置语言环境之前触摸 HttpSession。喜欢request.getSession(true).setAttribute("whatever", "bar")。好像需要召回服务器,SessionService 想要对 Session 做一些事情。这是为什么呢?

【问题讨论】:

  • 我遇到了完全相同的问题。我使用的是 GAE 1.9.10、Guice 3.0 但没有 Jersey。解决了吗?
  • 因为我有这种解决方法,所以我没有进一步试验。不过,我很高兴知道如何正确地做到这一点。

标签: java google-app-engine jersey guice session-scope


【解决方案1】:

我找到了一种方法来获得所需的类似 SessionScoped 的功能。不要使用@SessionScoped,因为它显然不适用于GAE,而是使用Provider<HttpSession>

所以你的代码会是这样的

public class SessionService {
    @Inject Provider<HttpSession> httpSessionProvider;

    public void saveSecurityInfo(Object securityInfo) {
        httpSessionProvider.get().setAttribute('sec_info', securityInfo);
    }

    public Object loadSecurityInfo() {
        return httpSessionProvider.get().getAttribute('sec_info');
    }
}

在控制器中,您可以将其插入为 @Inject SessionService sessionService;

我已经在 GAE 上测试了这种方法并且它有效(在浏览器会话中保留信息)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2011-08-12
    • 2013-11-07
    • 1970-01-01
    • 2013-09-29
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多