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

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

问题描述:

我们运行Tomcat的Apache infront并使用mod_jk。我们在Apache模块上的单点登录设置了有关用户的信息,我们可以使用getAttribute()调用在Java中检索该用户。为什么ServletRequest的getAttribute()具有不同于getAttributeNames()的属性?

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。

这是因为任何使用mod_jk设置的属性都可用于getAttribute(),但不能通过getAttributeNames()。按照documentation

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

我到(每BalusC的建议)中的所有RequestWrappers和底层request具有用于getAttributeNames()属性的内部地图调试。但是,当内部映射的值为空时,getAttribute()会落入另一个对象。从javadoc和文档,这是按照设计工作。

这种现象以前已经报道为bug,但修复失败的TCK测试:

我望着眼前,包括从getAttributeNames返回 (所有Tomcat的内部属性),但是这会导致问题Servlet 2.5 TCK 这些测试期望getAttributeNames()仅返回那些通过setAttribute()已经设置的属性 。

因此,在短期,getAttributeNames()将返回setAttribute()getAttribute()可以返回通过各种其他(内部)装置设定的属性设定的属性。