我有两个应用程序,在第一个应用程序中说用户通过用户名和密码登录。我通过在应用程序 A 中使用 spring 身份验证对象登录用户名。应用程序 A 正在对应用程序 B 进行休息或肥皂 api 调用。我通过在休息或肥皂调用 header 中添加用户名,将用户名从 A 传递到 B 应用程序。应用程序 B 正在进行数据库调用,对 SQL 数据库执行 CRUD。我想将该用户名保存在更新者、修改者字段中。我使用 bean 来存储用户名,但是当多个用户使用应用程序时,它会被覆盖。如何实现这一目标?谢谢您
在下面的拦截器中,userSync将保存我当前登录的用户名,usernameGetter将用于从http请求中获取当前登录的用户名。 userSync 和 usernameGetter 是单例 bean。
public class RequestInterceptor extends HandlerInterceptorAdapter {
private DomainUserSynchronizer userSynchronizer;
@Autowired
UsernameGetter usernameGetter;
@Autowired
private UserSynchronizer userSync;
private static final Logger LOGGER = LoggerFactory.getLogger(RequestInterceptor.class);
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
LOGGER.info("Inside after completion");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
// do nothing
}
@Override
public 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;
}
public DomainUserSynchronizer getUserSynchronizer() {
return userSynchronizer;
}
public void setUserSynchronizer(DomainUserSynchronizer userSynchronizer) {
this.userSynchronizer = userSynchronizer;
}
}
最佳答案
我猜你的问题出在你通过Spring声明的bean的范围内:https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
我建议您检查所有调用是否都经过请求范围的最大级别。
您的问题中要解决的另一点是通过您所做的每次调用来确认/回滚事务。您可能会覆盖数据库实体而不提交它。
为了避免更新中的覆盖,我建议添加一个日志表,在其中跟踪所有修改,并且只能对其进行插入(不可变/审核行)
关于java - 在Java Spring 4中从应用程序A到应用程序B进行rest或soap api调用时,将用户名存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56327443/