由線程安全引起的一個有關Realm問題

我的項目裏需要給Tomcat寫一個 Realm,大家都知道Realm接口裏簡化如下:

public interface Realm {
public Principal authenticate(String username, String credentials);
...
public SecurityConstraint [] findSecurityConstraints(Request request, Context context);
...
}

爲了節省篇幅,把Realm接口簡化了一下。 由於項目需要必須要在authenticate方法裏使用request, 而通過摸索在Realm裏只有findSecurityConstraints方法裏能得到這個request. 於是我就寫了Realm如下:

public class MyRealm extends JAASRealm {
protected HttpServletRequest request;
public Principal authenticate(String username, String credentials){
//在這裏使用request。
}
...
public SecurityConstraint [] findSecurityConstraints(Request request, Context context){
this.request = request;
return super.findSecurityConstraints(request, context);
}
}


這樣測試"良好", 似乎是可行的。 功能也都能過。
但是高手一看就會發現問題,因爲request對象是變化的,並且Realm在整個Tomcat裏只有一個實例(至少在只配置一個Realm的時候是這樣的,配置多個Realm我還沒有試)。這樣就導致了request方法對多線程不安全,甚至混亂。
請高手幫着看一下:
[b]
1. 是不是有其他更好的辦法在Realm訪問request對象?
2. 如果第一個問題是否定的,看有沒有辦法使這個request安全的被訪問?[/b] (我知道用ThreadLocal來解決,還有沒有其他辦法)
請大家幫忙了。謝謝。
發佈了16 篇原創文章 · 獲贊 0 · 訪問量 1934
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章