Use HttpServletRequest or RequestContextHolder or @RequestHeader to get http request header information

Records: 392

Scenario: To obtain HTTP request header information in microservices, you can inject HttpServletRequest into the code; you can use Spring’s RequestContextHolder, and you can use the @RequestHeader annotation.

Version: JDK 1.8, SpringBoot 2.6.3, springCloud 2021.0.1

1. Use HttpServletRequest to get request header information

1.1 Get the request header at the Controller layer of the microservice

The essence is to use the annotation @Autowired to inject the implementation object of the HttpServletRequest interface.

@RestController
@RequestMapping("/hub/example/city")
@RefreshScope
@Slf4j
public class CityController {
  // Inject HttpServletRequest
  @Autowired
  private HttpServletRequest request;
  @PostMapping("/queryCityByCityId")
  public ResultObj<CityDTO> queryCityByCityId(String cityId) {
    // Get information from the request header
    log.info("cityCode = " + request.getHeader("cityCode"));
    return ResultObj.data(200, new CityDTO(), "Execution succeeded");
  }
}

1.2 Get request headers in other classes of microservices

In microservice Service, Dao, or other classes, as long as there are classes annotated with @RestController, @Controller, @Service, @Component, @Repository, etc., you can inject HttpServletRequest to obtain request header information.

2. Use RequestContextHolder to get request header information

2.1 About RequestContextHolder

org.springframework.web.context.request.RequestContextHolder is a tool class for Spring to obtain the request context. The static method provided by this class can get the request header information.

2.2 Using RequestContextHolder

RequestAttributes reqAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes) reqAttributes).getRequest();
String cityCode = request. getHeader("cityCode");

2.2 Usage scenarios

This class can be used in any Spring loaded class.

3. Use RequestContextHolder to get request header information

3.1 About @RequestHeader

org.springframework.web.bind.annotation.RequestHeader, spring annotation.

3.2 Using @RequestHeader

RestController
@RequestMapping("/hub/example/city")
@RefreshScope
@Slf4j
public class CityController {
  @PostMapping("/queryCityByCityId")
  public ResultObj<CityDTO> queryCityByCityId(@RequestParam("cityId") String cityId, @RequestHeader String cityNo) {
    log.info("cityNo = " + cityNo);
    return ResultObj.data(200, new Date(), "Execution succeeded");
  }
}

3.3 When using @RequestHeader, the OpenFeign interface needs to be adjusted appropriately

It seems very convenient to use @RequestHeader annotation, one annotation solves it.

However, when using @RequestHeader, the OpenFeign interface needs to be adjusted appropriately.

for example:

@FeignClient(contextId = "cityFeignService",
        value = "hub-example-301-nacos",
        fallbackFactory = CityFeignServiceFallbackFactory.class,
        configuration = {FeignConfiguration. class})
public interface CityFeignService {
  @PostMapping("/hub-301-nacos/hub/example/city/queryCityByCityId")
  ResultObj<CityDTO> queryCityByCityId(@RequestParam("cityId")String cityId);
}

4. About Spring’s HttpHeaders request header object

4.1 Attributes defined by HttpHeaders

Full name: org.springframework.http.HttpHeaders.

public static final String ACCEPT = "Accept";
public static final String ACCEPT_CHARSET = "Accept-Charset";
public static final String ACCEPT_ENCODING = "Accept-Encoding";
public static final String ACCEPT_LANGUAGE = "Accept-Language";
public static final String ACCEPT_PATCH = "Accept-Patch";
public static final String ACCEPT_RANGES = "Accept-Ranges";
public static final String ACCESS_CONTROL_ALLOW_CREDENTIALS = "Access-Control-Allow-Credentials";
public static final String ACCESS_CONTROL_ALLOW_HEADERS = "Access-Control-Allow-Headers";
public static final String ACCESS_CONTROL_ALLOW_METHODS = "Access-Control-Allow-Methods";
public static final String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";
public static final String ACCESS_CONTROL_EXPOSE_HEADERS = "Access-Control-Expose-Headers";
public static final String ACCESS_CONTROL_MAX_AGE = "Access-Control-Max-Age";
public static final String ACCESS_CONTROL_REQUEST_HEADERS = "Access-Control-Request-Headers";
public static final String ACCESS_CONTROL_REQUEST_METHOD = "Access-Control-Request-Method";
public static final String AGE = "Age";
public static final String ALLOW = "Allow";
public static final String AUTHORIZATION = "Authorization";
public static final String CACHE_CONTROL = "Cache-Control";
public static final String CONNECTION = "Connection";
public static final String CONTENT_ENCODING = "Content-Encoding";
public static final String CONTENT_DISPOSITION = "Content-Disposition";
public static final String CONTENT_LANGUAGE = "Content-Language";
public static final String CONTENT_LENGTH = "Content-Length";
public static final String CONTENT_LOCATION = "Content-Location";
public static final String CONTENT_RANGE = "Content-Range";
public static final String CONTENT_TYPE = "Content-Type";
public static final String COOKIE = "Cookie";
public static final String DATE = "Date";
public static final String ETAG = "ETag";
public static final String EXPECT = "Expect";
public static final String EXPIRES = "Expires";
public static final String FROM = "From";
public static final String HOST = "Host";
public static final String IF_MATCH = "If-Match";
public static final String IF_MODIFIED_SINCE = "If-Modified-Since";
public static final String IF_NONE_MATCH = "If-None-Match";
public static final String IF_RANGE = "If-Range";
public static final String IF_UNMODIFIED_SINCE = "If-Unmodified-Since";
public static final String LAST_MODIFIED = "Last-Modified";
public static final String LINK = "Link";
public static final String LOCATION = "Location";
public static final String MAX_FORWARDS = "Max-Forwards";
public static final String ORIGIN = "Origin";
public static final String PRAGMA = "Pragma";
public static final String PROXY_AUTHENTICATE = "Proxy-Authenticate";
public static final String PROXY_AUTHORIZATION = "Proxy-Authorization";
public static final String RANGE = "Range";
public static final String REFERER = "Referer";
public static final String RETRY_AFTER = "Retry-After";
public static final String SERVER = "Server";
public static final String SET_COOKIE = "Set-Cookie";
public static final String SET_COOKIE2 = "Set-Cookie2";
public static final String TE = "TE";
public static final String TRAILER = "Trailer";
public static final String TRANSFER_ENCODING = "Transfer-Encoding";
public static final String UPGRADE = "Upgrade";
public static final String USER_AGENT = "User-Agent";
public static final String VARY = "Vary";
public static final String VIA = "Via";
public static final String WARNING = "Warning";
public static final String WWW_AUTHENTICATE = "WWW-Authenticate";
public static final HttpHeaders EMPTY = new ReadOnlyHttpHeaders(new LinkedMultiValueMap());
private static final Pattern ETAG_HEADER_VALUE_PATTERN = Pattern.compile("\*|\s*((W\/)?("[^"]*"))\s*,?");
private static final DecimalFormatSymbols DECIMAL_FORMAT_SYMBOLS;
private static final ZoneId GMT;
private static final DateTimeFormatter DATE_FORMATTER;
private static final DateTimeFormatter[] DATE_PARSERS;
final MultiValueMap<String, String> headers;

4.2 enum attribute defined by HttpMethod

Full name: org.springframework.http.HttpMethod.

public enum HttpMethod {
  GET,
  HEAD,
  POST,
  PUT,
  PATCH,
  DELETE,
  OPTIONS,
  TRACE;
}

Above, thanks.

March 24, 2023