@ 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 8

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 () ' вы можете получить реальные экземпляры запроса / ответа в виде прокси.