我们运行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。
答案 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()
可以返回通过各种其他(内部)方式设置的属性。