java - 在应用程序层之间提供身份验证和授权信息的好方法

标签 java google-app-engine session authentication thread-local

我有一个在适用于 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/

相关文章:

使用 Cookie 和加盐哈希的 PHP 登录系统

java - 如何告诉 NetBeans 我的 Tomcat "home"在哪里?

java - 使用 next() 调用 ArrayList 的下一次迭代

PHP : session variable having an undefined offset error

multithreading - Spring + Hibernate 跨多个线程的 session 管理

java - 如何连接到 Google App Engine 上的远程 RDBMS

java - Date.toString() - sql 与 util 日期

java - 如何在自定义适配器 Android Studio Java 中将标签设置为行

google-app-engine - 如何使用 Google appengine ndb 跨属性进行验证?

google-app-engine - 如何使用结构数组实现 google datastore propertyloadsaver