我有兩個應用程序,在第一個應用程序中說用戶通過用戶名和密碼登錄。我通過在應用程序 A 中使用 spring 身份驗證對象登錄用戶名。應用程序 A 正在對應用程序 B 進行 rest 或 soap api 調用。我通過在 rest 或 soap 調用的標頭中添加用戶名將用戶名從 A 傳遞到 B 應用程序。應用程序 B 正在調用數據庫,在 SQL 數據庫上執行 CRUD。我想將該用戶名保存在更新者、修改者字段中。我使用 bean 來存儲用戶名,但是當多個用戶使用應用程序時,它會被覆蓋。如何實現?謝謝在下面的攔截器中,userSync 將保存我當前登錄的用戶名,usernameGetter 將用于從 http 請求中獲取當前登錄的用戶名。userSync 和 usernameGetter 是單例 bean。public class RequestInterceptor extends HandlerInterceptorAdapter {private DomainUserSynchronizer userSynchronizer;@AutowiredUsernameGetter usernameGetter;@Autowiredprivate UserSynchronizer userSync;private static final Logger LOGGER = LoggerFactory.getLogger(RequestInterceptor.class);@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { LOGGER.info("Inside after completion");}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // do nothing}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); // Enumeration e = (Enumeration) (session.getAttributeNames()); //session.getAttribute("an"); //session.getAttribute("MYSPEAK_SESSION_HASH"); String username = usernameGetter.getUsernameFromSession(request); if(username!=null && !username.isEmpty()){ LOGGER.info("Found username in request: "+ username); LOGGER.info("Setting username in userSynchronizer: "+ username); userSync.getCurrentUser().setName(username); } else{ LOGGER.info(" Username not found in request: "); LOGGER.info("Setting default username in userSynchronizer: "+ userSync.getCurrentUser().getName()); } return true;}
1 回答

斯蒂芬大帝
TA貢獻1827條經驗 獲得超8個贊
我猜你的問題在你通過 Spring 聲明的 bean 的范圍內:https ://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
我建議您檢查所有調用是否都經過最大級別的請求范圍。
解決您的問題的另一點是通過休息/肥皂確認/回滾每次呼叫的交易。您可能會在不提交的情況下覆蓋數據庫的實體。
為了避免更新中的覆蓋,我建議添加一個日志記錄表,您可以在其中跟蹤所有修改,并且您只能對其進行插入(不可變/審計行)
添加回答
舉報
0/150
提交
取消