4

我有一个在 Google App Engine (GAE) for JAVA 上运行的网络应用程序。我在 Servlet 层对客户端进行身份验证,但希望将客户端信息提供给我的业务和数据层,而不必通过每个函数的参数传递客户端对象。

我正在考虑使用 ThreadLocal 设置“会话”类型的对象。这样任何函数都可以说如下:

CurrentUser.getRoles();

这是做到这一点的好方法,还是有其他更受欢迎的解决方案?

谢谢!

4

3 回答 3

3

这可能会起作用并且非常方便,但通常我会尽量避免ThreadLocals 用于类似的用例。原因:

  • 您的代码突然开始依赖于底层容器为不同用户使用不同线程的事实。如果容器将开始使用 NIO、不同类型的线程(例如,不会映射到java.lang.Thread某些奇异 JVM 上的绿色线程)等,您将不走运。

  • ThreadLocal使用后往往会忘记清理。因此,如果您的服务器使用量激增并且其中一个用户将大量内容放入“缓存”中,那么您的 RAM 可能会用完。

  • 由于在请求后不清理,ThreadLocal可能会暴露安全漏洞,假设其他用户会跳转到同一个线程。

  • 最后,我相信ThreadLocals 是为您对上下文中的线程有绝对控制权的环境而设计的,而这个用例远远超出了这个范围。

不幸的是,我对 GAE 了解不多,无法提出可行的替代方案,对此感到抱歉!

于 2010-05-16T21:19:34.710 回答
1

ThreadLocals 是一种完全被接受的存储此类信息的方式。除了我们之外,我还从Alfresco知道他们这样做。

于 2010-05-16T20:20:39.960 回答
1

如果使用 Spring 和 Spring Security 对您有用,那么您可以使用我在jappstart中构建的代码进行身份验证/授权。然后可以通过 Spring Security 获得此信息。

于 2010-05-17T18:38:30.447 回答