【问题标题】:Why does ServletRequest getAttribute() have different attributes than getAttributeNames()?为什么 ServletRequest getAttribute() 与 getAttributeNames() 有不同的属性?
【发布时间】:2023-03-16 04:16:01
【问题描述】:

我们在 Tomcat 前面运行 Apache 并使用 mod_jk。我们在 Apache 模块上的单点登录设置了有关用户的信息,我们可以通过 getAttribute() 调用在 Java 中检索这些信息。

String mobileNumber = request.getAttribute("WEBAUTH_LDAP_MOBILE");

这很好用。现在我想检索所有属性并查找以前缀“WEBAUTH_LDAP_”命名的属性。我为此使用了getAttributeNames()

Enumeration<String> enumeration = request.getAttributeNames();

获取属性名称。令我惊讶的是,没有名为“WEBAUTH_LDAP_MOBILE”的属性。 这是预期的吗?有没有办法获取所有属性? JavaDoc 听起来好像 getAttribute() 中的某些内容也应该在 getAttributeNames() 中。

我们使用的是 Tomcat 6.0.28。

【问题讨论】:

    标签: java servlets request


    【解决方案1】:

    这是因为任何使用 mod_jk 设置的属性都可以通过 getAttribute() 获得,但不能通过 getAttributeNames() 获得。根据documentation

    您可以通过以下方式检索 Tomcat 上的变量作为请求属性 request.getAttribute(属性名)。请注意,变量通过 JkEnvVar 不会在 request.getAttributeNames() 中列出。

    我调试了所有 RequestWrappers(根据 BalusC 的建议),底层的 request 有一个用于 getAttributeNames() 的内部属性映射。但是,当内部映射的值为 null 时,getAttribute() 会掉入另一个对象。从 javadoc 和文档来看,这是按设计工作的。

    此行为之前已报告为 bug,但修复未通过 TCK 测试:

    我查看了只在返回中包含所有 Tomcat 内部属性 来自 getAttributeNames() 但这会导致 Servlet 2.5 TCK 出现问题 期望 getAttributeNames() 只返回那些属性的测试 已通过 setAttribute() 设置。

    简而言之,getAttributeNames() 将返回使用setAttribute() 设置的属性,而getAttribute() 可以返回通过各种其他(内部)方式设置的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-04
      • 2015-07-23
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多