2011-09-07 64 views
1

我們運行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。

回答

1

這是因爲任何使用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()可以返回通過各種其他(內部)裝置設定的屬性設定的屬性。

相關問題