我有一个在适用于 JAVA 的 Google App Engine (GAE) 上运行的 Web 应用程序。我在 Servlet 层对客户端进行身份验证,但希望使客户端信息可用于我的业务和数据层,而不必通过每个函数的参数传递客户端对象。
我正在考虑使用 ThreadLocal 设置一个“ session ”类型的对象。这样任何函数都可以像这样说:
CurrentUser.getRoles();
这是执行此操作的好方法还是有其他更容易接受的解决方案?
谢谢!
最佳答案
这可能会奏效并且非常方便,但通常我会尽量避免在类似用例中使用 ThreadLocal
。原因:
您的代码突然开始依赖于底层容器为不同用户使用不同线程这一事实。如果容器将开始使用 NIO、不同类型的线程(例如,不会映射到某些奇异 JVM 上的
java.lang.Thread
的绿色线程)等,您将倒霉。ThreadLocal
在使用后往往会被遗忘清理。因此,如果您的服务器使用量激增并且其中一位用户将大量内容放入“缓存”,您可能会耗尽 RAM。由于在请求后没有清理,
ThreadLocal
可能会暴露安全漏洞,假设其他用户会跳转到同一线程。最后,我相信
ThreadLocal
是为您对上下文中的线程拥有绝对控制权的环境而设计的,而这个用例远远超出了这一范围。
不幸的是,我对 GAE 了解不多,无法提出可行的替代方案,对此感到抱歉!
关于java - 在应用程序层之间提供身份验证和授权信息的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845207/