为什么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()
可以返回通过各种其他(内部)装置设定的属性设定的属性。