我使用線程local來存儲用戶請求的特定功能(例如瀏覽器代理),它用於在JAVA 7上正常工作,但現在升級到JAVA 8之後在某些情況下,來自android瀏覽器的請求處理,就好像它來自iOS瀏覽器一樣,即使它已被正確檢測爲android瀏覽器,但後來在處理請求時被替換爲另一個線程本地值!我不確定在這裏有什麼缺失可以幫助我嗎?我的環境設置(之前/之後)升級是:在tomcat升級到JAVA之後,Threadlocal行爲異常8
- tomcat 8之前和之後。
- JAVA 7〜8
- 春天從4.1.7升級到3.2.3,從4.2.5升級
- 春季安全升級到4.03
我有一個安全過濾器,看起來像這樣的:
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.web.filter.GenericFilterBean;
public class AuthenticationTokenProcessingFilter extends GenericFilterBean {
private final IdentityService identityService;
public AuthenticationTokenProcessingFilter(IdentityService userService) {
this.identityService = userService;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
SecurityManager.manager().clearManager();
HttpServletRequest httpRequest = this.getAsHttpRequest(request);
String agent = httpRequest.getHeader("User-Agent");
SecurityManager.manager().setAgent(agent);
...
chain.doFilter(request, response);
}
}
和安全管理是這樣的:
import com.appseleon.platform.web.shared.CrossAppConstants;
public class SecurityManager {
private static SecurityManager manager;
private final ThreadLocal<String> agentContext = new ThreadLocal<String>();
private SecurityManager() {
manager = this;
}
public void clearManager() {
agentContext.set(null);
}
public static SecurityManager manager() {
return manager;
}
public String getAgent() {
String os = agentContext.get();
if (os == null) {
os = CrossAppConstants.DEFAULT_OS;
}
return os;
}
public void setAgent(String agent) {
System.out.println("### os detected: " + agent);
agentContext.set(agent);
}
}
設置代理後,最後在我的代碼各個領域我所說的安全管理器來獲得當前用戶代理:
SecurityManager.manager().getAgent()
誰能幫我找出這個問題的原因,甚至是可選的更可靠的方法來實現這一點?
感謝提前:)
非常感謝你,我會嘗試一下,並將結果發回! – user1221612
我花了我的時間來正確地測試和監控它,這個解決方案工作正常:) 謝謝! – user1221612