@ Context HttpServletRequest область видимости в контейнере ContainerResponseFilter Джерси
Я пишу ответный фильтр Джерси. Я использую Джерси 1.17. Я хочу получить доступ к некоторым атрибутам httpServletRequest в API фильтра. То, что я делаю прямо сейчас, выглядит так, как показано ниже. Безопасно ли вводить servletRequest, как в приведенном ниже фрагменте, или это вызовет какие-то проблемы с параллелизмом? Если есть несколько запросов, поступающих в conncurrently, будет ли servletRequest в различных запросах перезаписывать друг друга? Спасибо за ваш глеп.
public class LoggingFilter implements ContainerResponseFilter {
@Context private HttpServletRequest servletRequest;
@Override
public ContainerResponse filter(final ContainerRequest req, final ContainerResponse resp) {
String s = this.servletRequest.getAttribute("xxx");
....
}
}
2 ответа:
Раздел 9.1 (последний, 5.1 ранее) параллелизм спецификации JAX-RS гласит:
Контекст специфичен для конкретного запроса, но экземпляры некоторых Компоненты JAX-RS (поставщики и классы ресурсов с жизненным циклом кроме per-request) может потребоваться поддержка нескольких одновременных запросы. При введении экземпляра одного из типов, перечисленных в Раздел 9.2, предоставленный экземпляр должен быть способен выбирать правильный контекст для конкретного запрос. Использование локального прокси-сервера потока является распространенным способом добиться этого.
Таким образом, согласно спецификации, реализации JAX-RS (например, Джерси) необходимы для обеспечения безопасности контекста. Продолжайте делать то, что вы делаете.
Смотрите также: извлечение атрибутов запроса из контейнерного запроса Джерси
Ты в безопасности. Когда вы делаете инъекции
HttpServletRequest
/HttpServletResponse
Вы имеете дело не с конкретным экземпляром, а скорее с прокси, через который вы вызываете вызовы реального экземпляра, хранящегося в объекте ThreadLocal. Каждый запрос обрабатывается отдельным потоком, который имеет доступ к своему собственному потоку.HttpServletRequest
/HttpServletResponse
. Кроме инъекцийHttpServletRequest
/HttpServletResponse
Вы можете также впрыснутьThreadLocal<HttpServletRequest>
/ThreadLocal<HttpServletResponse>
и через метод '# get () ' вы можете получить реальные экземпляры запроса / ответа в виде прокси.