如何在GAE上的sitebricks方法中注入请求范围的HttpSession?

时间:2013-09-18 20:29:07

标签: google-app-engine servlets guice httpsession sitebricks

我有以下sitebricks servlet。 Foo.get()可以GET的{​​{1}}访问/foo/bar。我将servlet部署到GAE

@Service
@At("/foo")
@Singleton
public class Foo {
  @Get
  @At("/bar")
  public Reply<?> bar(Request<String> request, HttpSession session) {
    // access request scoped HttpSession 
  }
}

如果我正确理解了sitebricks,则可以通过sitebricks注入Request和HttpSession(可能在Guice的帮助下)。它还将确保HttpSession是当前请求的本地。并发请求将在Foo的同一个实例上执行,因为该类已使用@Singleton注释(请参阅Guice docs)。但即使并发请求到达同一个JVM,bar()的每次调用都会根据客户端传入的JSESSIONID拥有自己的HttpSession。 所有这些假设都有效吗?

当针对我的应用程序运行负载测试时,我注意到sitebricks / Guice传入的HttpSession以非常低的速率为空。我目前正在谷歌的支持下对此进行故障排除。但除了GAE之外 - 从sitebricks / Guice的角度来看,这会导致什么呢?

found a code snippet将一个Provider注入到构造函数中。这是否意味着我可以/应该通过调用Provider.get()而不是让sitebricks将其作为方法参数注入来获取HttpSession?

相关问题:

更新

  • 我从bar等所有servlet方法中删除了HttpSession参数。我在servlet中注入了Provider<HttpSession>并调用provider.get()来获取会话。到目前为止我运行的测试表明,这比从参数中获取HttpSession更可靠。也就是说,我不确定会话是否由sitebricks或GAE本身提供。 是否由servlet容器提供了HttpSession?

1 个答案:

答案 0 :(得分:0)

通常我首先将HttpServletRequest注入服务类,然后从请求中获取HttpSession对象,这对我来说效果很好。

例如:

@At("/preview")
@Service
public class PreviewService {

  @Inject
  private HttpServletRequest request;

  // It's similar if we need to modify response directly
  @Inject
  private HttpServletResponse response;

  @Get
  public Reply<?> get() {
    HttpSession session = request.getSession();
    ... ...
  }
}

希望它有所帮助。