为什么ServletRequest getAttribute()具有与getAttributeNames()不同的属性?

时间:2011-09-07 17:56:13

标签: java servlets request

我们运行Tomcat的Apache infront并使用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。

1 个答案:

答案 0 :(得分:1)

这是因为使用mod_jk设置的所有属性都可以getAttribute()使用,但不能通过getAttributeNames()使用。根据{{​​3}}

  

您可以在Tomcat上检索变量作为请求属性   request.getAttribute(的attributeName)。请注意,变量通过发送   JkEnvVar不会列在request.getAttributeNames()。

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

此行为先前已报告为request,但该修复无法通过TCK测试:

  

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

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