У меня проблемы с сохранением текущего пользователя из запроса веб-службы в базе данных истории.
Я полагаю, это из-за тайм-аута сеанса в дескрипторе развертывания сервлета <session-timeout>120</session-timeout>
и этого клиент - это микросервис (пользовательское приложение -> микросервис -> веб-сервис). Пользовательское приложение отправляет авторизацию в базовом c, а микросервис просто передает его запросу веб-службы.
Мы можем воспроизвести проблему следующим образом:
- пользователь -app A выполняет запрос, пользователь A сохраняется в истории db
- пользовательское приложение B выполняет запрос, пользователь A сохраняется в истории db
Подробная информация о веб-сервисе:
<session-config>
<session-timeout>120</session-timeout>
</session-config>
<security-constraint>
<display-name>Login Security Constraint WS</display-name>
<web-resource-collection>
<web-resource-name>Protected Area WS</web-resource-name>
<url-pattern>/MyWebService</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Superuser</role-name>
<role-name>etc</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ABC</realm-name>
</login-config>
Java:
@Resource
public void setContext(final WebServiceContext context) {
this.context = context;
}
...
HttpServletRequest request = (HttpServletRequest) context.getMessageContext().get(MessageContext.SERVLET_REQUEST);
username = request.getUserPrincipal().getName();
Я думал, что один из способов решения моей проблемы - чтобы изменить сервлет с сеанса на область запроса.
Но не знаю, как это изменить.
Спасибо за вашу помощь!