Сохраняйте имя пользователя в базе данных при выполнении вызовов rest или soap api из приложения A в приложение B в Java Spring 4 - PullRequest
0 голосов
/ 27 мая 2019

У меня есть два приложения, в первом из которых написано «Вход пользователя по имени пользователя и паролю».Я вошел в систему с именем пользователя с помощью объекта весенней аутентификации в приложении A. Приложение A выполняет вызовы rest или soap api в приложение B. Я передаю имя пользователя из приложения A в B, добавляя имя пользователя в заголовок вызовов rest или soap.Приложение B делает вызовы базы данных, делает CRUD на базе данных SQL.Я хочу сохранить это имя пользователя в обновленном, измененном полями.Я использовал bean для хранения имени пользователя, но когда несколько пользователей используют приложение, оно перезаписывается.Как этого можно достичь?Спасибо

В следующем перехватчике userSync сохранит мое текущее зарегистрированное имя пользователя, usernameGetter будет использоваться для получения текущего зарегистрированного имени пользователя из запроса http.userSync и usernameGetter являются одноэлементными компонентами.

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;
}
}

1 Ответ

1 голос
/ 27 мая 2019

Я полагаю, ваша проблема находится в области действия bean-компонентов, которые вы объявили через Spring: https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

Я бы порекомендовал вам проверить, чтобы все вызовы проходили через максимальный уровень области запроса.

Еще один момент, который необходимо решить в вашей проблеме, - это подтверждение / откат транзакции для каждого звонка с помощью оставшихся / выполненных вами операций. Вполне возможно, что вы перезаписываете сущность базы данных без ее фиксации.

Чтобы избежать также переопределений в обновлениях, я бы предложил добавить таблицу регистрации, в которой вы отслеживаете все изменения, и вы можете делать только вставки в нее (неизменяемые / строки аудита)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...