我正在編寫Spring REST類型接口到數據庫的過程中,該數據庫將檢索各種資源的用戶特定結果。Spring Rest Web請求範圍
爲了容納用戶,我有一個名爲CurrentUser的彈簧@Component註釋bean作爲臨時度量。
@Component
public class CurrentUser {
@Autowired
private UserDAO userDAO;
private String userId;
private String email;
private String notes;
public String getUserId() {
return userId;
}
public void setUserId(String userId) throws ApiException {
User user = userDAO.getUser(userId) // Database call to
if (!user.isValid()) {
throw ApiException(...) // The exception would crash back to the user as a error in the response
}
// Valud user so set these aspects.
this.userId = user.userId;
this.email = user.email;
}
}
在使用以下攔截器對API中的任何方法進行每次調用時,都會在Spring Interceptor中初始化此對象。
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {
@Autowired
private CurrentUser user;
@Autowired
private RequestParameters requestParameters;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ApiException {
user.setUserId(StringUtils.defaultString(request.getParameter("userId"), "defaultUser"));
return true;
}
}
這只是一個識別用戶的位置持有者,直到可以添加正確的身份驗證。
我是比較新的春天,而這個職位 的原因是爲了增加我的春天的線程安全方面的瞭解,情況是這樣
我最近發現,春天不會自動線程安全,我可能需要更多地考慮範圍。
我想了解的是以下幾點:
對於上面的設置,有沒有危險,同時提出請求的1000,可能會干擾和相互覆蓋? 例如對於一個用戶的請求可能會被不同的用戶從單獨的http請求覆蓋,導致請求者接收到錯誤的數據。
什麼是解決這個問題的最佳方法。 (即使它將被替換,我也有類似的方式實例化其他對象) 我正在看的選項(如果這是一個問題),設置原型範圍或直接附加到請求/會話而不是允許他們擁有自動裝配的對象。
任何人都可以給我的任何信息都會非常感謝,因爲我一開始就想讓它變得正確(呃),而不是稍後處理不好的假設。
我們甚至有這種懷疑並有嚴格的批量測試,發現春天默認情況下不處理基於請求的數據。因此,在項目和服務層中啓用基於事務的配置。 您也可以在請求範圍中配置bean,理想情況下,它們具有將同步塊放入方法中的類似效果。 – Jango