我有两个应用程序,在第一个应用程序中说用户通过用户名和密码登录。我通过在应用程序 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
提交
取消