我有以下sitebricks servlet。 Foo.get()GET处可作为/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
  }
}


如果我正确理解sitebrick,则request和HttpSession都由sitebrick注入(可能在Guice的帮助下)。它还将确保HttpSession对于当前请求是本地的。由于类是用Foo注释的,因此并发请求将在@Singleton的同一实例上执行(请参见Guice docs)。但是,即使并发请求到达了相同的JVM,每次bar()的调用都将基于客户端传递的JSESSIONID拥有自己的HttpSession。所有这些假设是否正确?

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

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

相关问题:


Provider<HttpSession> not getting injected
How to @Inject a HttpSession object in a service layer (DAO) class in GWT using Guice?
Inject @SessionScoped value into filter with Guice


更新


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

最佳答案

通常我首先将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();
    ... ...
  }
}


希望能帮助到你。

10-07 18:25