我有一个在 Google App Engine (GAE) for JAVA 上运行的网络应用程序。我在 Servlet 层对客户端进行身份验证,但希望将客户端信息提供给我的业务和数据层,而不必通过每个函数的参数传递客户端对象。
我正在考虑使用 ThreadLocal 设置“会话”类型的对象。这样任何函数都可以说如下:
CurrentUser.getRoles();
这是做到这一点的好方法,还是有其他更受欢迎的解决方案?
谢谢!
我有一个在 Google App Engine (GAE) for JAVA 上运行的网络应用程序。我在 Servlet 层对客户端进行身份验证,但希望将客户端信息提供给我的业务和数据层,而不必通过每个函数的参数传递客户端对象。
我正在考虑使用 ThreadLocal 设置“会话”类型的对象。这样任何函数都可以说如下:
CurrentUser.getRoles();
这是做到这一点的好方法,还是有其他更受欢迎的解决方案?
谢谢!
这可能会起作用并且非常方便,但通常我会尽量避免ThreadLocal
s 用于类似的用例。原因:
您的代码突然开始依赖于底层容器为不同用户使用不同线程的事实。如果容器将开始使用 NIO、不同类型的线程(例如,不会映射到java.lang.Thread
某些奇异 JVM 上的绿色线程)等,您将不走运。
ThreadLocal
使用后往往会忘记清理。因此,如果您的服务器使用量激增并且其中一个用户将大量内容放入“缓存”中,那么您的 RAM 可能会用完。
由于在请求后不清理,ThreadLocal
可能会暴露安全漏洞,假设其他用户会跳转到同一个线程。
最后,我相信ThreadLocal
s 是为您对上下文中的线程有绝对控制权的环境而设计的,而这个用例远远超出了这个范围。
不幸的是,我对 GAE 了解不多,无法提出可行的替代方案,对此感到抱歉!
ThreadLocals 是一种完全被接受的存储此类信息的方式。除了我们之外,我还从Alfresco知道他们这样做。
如果使用 Spring 和 Spring Security 对您有用,那么您可以使用我在jappstart中构建的代码进行身份验证/授权。然后可以通过 Spring Security 获得此信息。