2010-11-09 28 views
0

因此,我需要爲彈簧應用程序添加一個過濾器,以便在將響應刷新到客戶端後,我會寫入日誌文件。我想要寫入日誌文件的值在應用程序中確定。換句話說,我希望將值傳遞給主處理完成後的過濾器,理想情況下是值的散列表。春天 - 如何將應用程序中的值傳遞給過濾器

有沒有這樣做的最佳做法?我可以想象,當請求首次進入時,我可以在過濾器中實例化哈希映射,將哈希映射存儲在某處(其中?),在應用程序中檢索並寫入該哈希映射,然後在出口過濾器中再次檢索它,然後編寫超值。這是最好的做法,如果是這樣的話,如果是這樣的話,如果是這樣的話:

1)我只有一個過濾器在進入和退出時觸發,或者我需要設置兩個,一個用於應用程序之前,一個用於之後?

2)哪裏是隱藏我的數據存儲的最佳實踐場所?

+0

嗯..閱讀文檔我得到的過濾器只有火的討厭的感覺是FORE處理到達servlet。是對的嗎?如何在servlet完成後發生某些事情?謝謝! – bruce 2010-11-09 05:37:32

回答

0
  1. 一個過濾器就足夠了。 In filter

    //在調用servlet之前。做點什麼

    chain.doFilter(request, wrapper); 
    

    //在servlet完成處理之後。在這裏檢索數據。

  2. 考慮ThreadLocal變量。我不確定這是否是最佳做法。您將數據存儲在servlet中並在過濾器中進行檢索(在'chain.doFilter()'之後),但請確保在請求完成之前清理存儲在ThreadLocal中的數據,因爲服務器池線程使您的線程本地數據可能不是。清洗
+0

太好了 - 謝謝 - 這確實有幫助。我沒有意識到doFilter方法是這樣鏈接的。這是完美的..至於變量,你怎麼看待做request.setAttribute(「mydatahash」,新的HashMap())或類似的東西 - 我看到的地方 - 使用請求作爲數據存儲? – bruce 2010-11-09 07:10:14

+0

是使用請求作爲數據存儲是更好的方式。您不必擔心清理ThreadLocal變量。有時候我們需要填充在servlet層以外訪問的數據(例子dao),在這種情況下使用ThreadLocal會有意義。Spring Security的SecurityContextHolder是ThreadLocal用法的一個示例。 – Adi 2010-11-09 07:28:34

2

@阿迪的回答解釋瞭如何用一個單一的過濾器和過濾器鏈接做的工作

而不是使用ThreadLocal不過,我建議你使用ServletRequest.getAttribute(...)ServletRequest.setAttribute(...);看到ServletRequest API文檔。

相關問題