Есть ли статический способ получить HttpServletRequest текущего запроса - PullRequest
20 голосов
/ 26 февраля 2009

Я использую аннотации Spring, я могу передать HttpRequestContext от Контроллера Сервису.

Я ищу статичный способ или какое-нибудь лучшее решение, чем обойти RequestContext.

Ответы [ 3 ]

48 голосов
/ 12 октября 2014

Если вы используете пружину, вы можете сделать следующее:

public static HttpServletRequest getCurrentHttpRequest(){
    RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
    if (requestAttributes instanceof ServletRequestAttributes) {
        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
        return request;
    }
    logger.debug("Not called in the context of an HTTP request");
    return null;
}
2 голосов
/ 24 января 2019

Или способ java8

public static Optional<HttpServletRequest> getCurrentHttpRequest() {
    return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
        .filter(requestAttributes -> ServletRequestAttributes.class.isAssignableFrom(requestAttributes.getClass()))
        .map(requestAttributes -> ((ServletRequestAttributes) requestAttributes))
        .map(ServletRequestAttributes::getRequest);
}
0 голосов
/ 26 февраля 2009

Я не думаю, что это хорошая идея. Сервисный уровень не должен знать или заботиться о том, имеет ли он дело с клиентом HTTP.

Статика тоже не очень подходит. HttpRequestContext должен быть связан с экземпляром HttpRequest, а не с конкретным классом.

Более совершенный дизайн, на мой взгляд, будет извлекать все, что нужно сервису, из контекста и передавать его. Нет необходимости подключать сервис к HTTP или веб-уровню.

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