Threadlocal爲每一個使用該變量的線程提供獨立的變量副本。tomcat
使用的狀況:對每個線程都必須持有一個類的實例,並且這個類是可變的(不可變的就是線程安全的,所有線程使用一個就能夠了),例如hibernate對session的處理。安全
問題場景:用戶登陸時,token保存在ThreadLocal裏,可是常常偶現 token失效(在tonken在有效時間裏)session
產生緣由:使用線程池或有複用線程時,複用同一個線程時,每次請求結束後ThreadLoca的值l沒有清空,致使第二次使用時ThreadLocal的token仍是上次遺留一下的token,以至tonken失效。hibernate
tomcat默認使用線程池,因此一個線程的生命週期不能對等於一個請求的生命週期,線程池中的線程是能夠被複用的。線程
解決方案:token
一、保證每次都用新的值覆蓋線程變量;生命週期
二、保證在每一個請求結束後清空線程變量。io