java - 在Java Spring 4中从应用程序A到应用程序B进行rest或soap api调用时,将用户名存储在数据库中

标签 java spring hibernate spring-security

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

相关文章:

java - 无法使用 EWS Java API 发送电子邮件

java - REST API - 嵌套对象

java - Java线程使用join()时如何引发InterruptedExpection?

java - 尝试保留已使用毫秒参数初始化的日期时出现 MysqlDataTruncation 异常

java - 配置更改无需重新部署

java - JpaRepository 查找左连接无限循环

java - 迁移到 JDK 11 后,Spring Boot 由于 Hibernate 错误而失败

java - 使用 PostgreSQL 和 Spring Boot 时是否有规则禁止将其实体类命名为 "User"?

java - 我想使用 Spring Controller 中的 Iterable 在 JSP 文件中创建和填充列表项

java - 如何强制正在读取行的 while 循环在 3 个空行之前不停止?