天天看點

Spring Mvc 公共Controller 使用攔截器注入請求資訊

在spring mvc 中我們在controller 中要想使用 httpservletrequest httpsession httpservletresponse 等請求資訊,這些資訊有多種方式,這裡就重點說下我使用的攔截器注入方式

方式一:(使用注解)

使用@modelattribute 注解實作。這個注解有幾個作用,如果不了解并且感興趣的可以去多了解。

方式二(攔截器注入):

第一步:我們需要一個公共攔截器

在攔截器中我們主要判斷攔截到的是否是我們的對應controller 然後調用對應指派方法。

setreqandres 方法和使用注解方法裡面的内容基本相似。

這樣我們就基本的對controller 裡面的請求資訊可以完全的控制了。在使用這個方法去指派的時候,在實際業務中我們發現了一個問題。

偶爾request 對象 或者session 對象會報錯,因為這兩的對象是使用頻率最高的。報錯最高的對象是request ,這裡由于沒有記錄這個錯誤現在也無法貼出錯誤資訊。後期看能遇到不,遇到就補上錯誤資訊。

大緻情況是這樣的。如果使用這樣的方式指派,那麼在我們的controller 的 scope 使用request 時候,這樣是完全沒有問題的。因為 controller 的scope 作用域是request 時,那麼就代表每一個請求 都會建立一個controller 對象這樣 對象裡面的變量就是獨立的。

如果我們将controller 的scope 改變不是request 時候,那麼可能出現多個請求使用的同一個controller 對象 這裡對象裡面的變量可能在後一個請求把request 對象給覆寫了 這樣如果前一個請求的響應耗時大于後一個請求,就意味着前一個請求使用request 對象的時候 就使用到了後一個請求的request 那麼這樣就出現異常了。

Spring Mvc 公共Controller 使用攔截器注入請求資訊

大緻是這樣的情況。一天我突然想到 因為我們都知道web 程式都是一個線程處理一個請求,我們先在同一個對象中區分不同線程的變量,java 中還存在這個類 那就是 threadlocal 這個類就是可以實作在區分不同線程中的不同值。

那麼進過改後的basecontrol 去掉以前的那些req res session 等成員變量 改為

同時把 setreqandres 方法也得改造 下

然後在我們需要對用對應變量時候,就得重新寫方法來擷取了

這樣就可以完美的解決了,就可以保證使用的request 等對象都是屬于自己的了。

對這個思路歡迎提出質疑和建議: