• 티스토리 홈
  • 프로필사진
    알쓸개잡
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
알쓸개잡
  • 프로필사진
    알쓸개잡
    • 분류 전체보기 (92)
      • 스프링부트 (52)
      • AWS (5)
      • 쿠버네티스 (7)
      • 자바 (19)
      • 인프라 (0)
      • ETC (8)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      • 반응형
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring REST 컨트롤러에서 HTTP 헤더 읽기
        2023년 10월 29일
        • 알쓸개잡
        • 작성자
        • 2023.10.29.:56

        Spring 컨트롤러에서 HTTP 헤더를 읽는 방법을 소개한다. 

        • @RequestHeader annotation
        • HttpServletRequest 인스턴스

         

        @RequestHeader annotation

        Spring은 전체 또는 특정 헤더 값을 컨트롤러 메서드의 인수로 맵핑하는 @RequestHeader annotation을 제공한다.

        @RequestHeader annotation 유형은 파라미터이다.

         

        HashMap을 통한 HTTP 헤더 읽기

        @RequestHeader annotation을 사용해 모든 HTTP 헤더를  Map 인스턴스에 맵핑한다.

        @PostMapping(value = "/read-header-map")
        public void readHeader(@RequestHeader Map<String, String>headers) {
            log.info("headers: {}", headers);
        }

        headers: {content-type=application/json, user-agent=PostmanRuntime/7.34.0, accept=*/*, host=localhost:8080, accept-encoding=gzip, deflate, br, connection=keep-alive, content-length=43}

         

        HTTPHeaders 인스턴스를 통한 HTTP 헤더 읽기

        HttpHeaders 인스턴스에 헤더 정보를 주입할 수도 있다.

        HttpHeaders는 MultiValueMap 클래스의 구현체이다.

        public class HttpHeaders implements MultiValueMap<String, String>, Serializable {...}
        @PostMapping(value = "/read-header-http-headers")
        public void readHeaderHttpHeaders(@RequestHeader HttpHeaders httpHeaders) {
            log.info("headers: {}", httpHeaders);
        }
        headers: [content-type:"application/json", user-agent:"PostmanRuntime/7.34.0", accept:"*/*", host:"localhost:8080", accept-encoding:"gzip, deflate, br", connection:"keep-alive", content-length:"43"]

         

        HttpHeaders가 MultiValueMap 클래스의 구현체이므로 MultiValueMap 타입으로도 헤더 정보를 주입받을 수 있다.

        MultiValueMap은 동일 키에 대해서 List 타입의 Value를 저장한다.

        public interface MultiValueMap<K, V> extends Map<K, List<V>>{...}
        @PostMapping(value = "/read-header-multi-value-map")
        public void readHeaderMultiValueMap(@RequestHeader MultiValueMap<String, String> httpHeaders) {
            log.info("headers: {}", httpHeaders);
        }
        headers: {content-type=[application/json], user-agent=[PostmanRuntime/7.34.0], accept=[*/*], host=[localhost:8080], accept-encoding=[gzip, deflate, br], connection=[keep-alive], content-length=[43]}

         

        특정 HTTP 헤더 읽기

        @RequestHeader를 사용하여 특정 헤더 필드만 읽을 수 있다.

        @PostMapping(value = "/read-header-specific")
        public void readHeaderSpecific(@RequestHeader("user-agent") String userAgent) {
            log.info("user-agent: {}", userAgent);
        }
        user-agent: PostmanRuntime/7.34.0

        @RequestHeader에 지정되는 필드명은 대소문자 구분을 하지 않는다.

        @RequestHeader에 지정된 헤더 필드는 Spring에서 필수 헤더로 취급한다.

        @RequestHeader에 지정된 헤더 필드가 요청 헤더에 존재하지 않으면 Spring은 400(Bad Request)를 응답한다.

        지정된 헤더 필드를 optional 하게 만들기 위해서는 다음과 같이 사용한다.

        @PostMapping(value = "/read-header-specific")
        public void readHeaderSpecific(
            @RequestHeader(
                value = "optional-header",
                required = false,
                defaultValue = "") String optionalHeader) {
            log.info("optional-header: {}", optionalHeader);
        }

        @RequestHeader에 지정된 헤더 필드가 요청 헤더가 없는 경우에는 헤더 필드 파라미터는 defaultValue에 지정된 값이 할당된다.

        defaultValue 속성이 지정된 경우 required 속성과 관계없이 지정된 헤더 필드가 요청 헤더에 없거나 Null 인 경우 defaultValue 속성에 지정된 값을 파라미터에 주입한다.

         

        HttpServletRequest를 통한 HTTP 헤더 읽기

        HttpServletRequest 인스턴스를 통해서 직접 요청 헤더 값을 읽을 수 있다.

        @PostMapping(value = "/read-header-servlet-request")
        public void readHeaderHttpServletRequest(HttpServletRequest request) {
            Enumeration<String> headerNames = request.getHeaderNames();
            while (headerNames.hasMoreElements()) {
                String headerName = headerNames.nextElement();
                log.info("{} : {}", headerName, request.getHeader(headerName));
            }
        }
        user-agent : PostmanRuntime/7.34.0
        accept : */*
        content-type : application/json
        host : localhost:8080
        accept-encoding : gzip, deflate, br
        connection : keep-alive
        content-length : 43

         

        저작자표시 비영리 변경금지 (새창열림)

        '스프링부트' 카테고리의 다른 글

        Spring Boot Embedded Tomcat 서버 설정  (0) 2023.11.03
        Spring Data JPA 에서 공간 정보(Spatial Data) 사용하기  (0) 2023.11.01
        Spring에서 특정 HTTP 응답 상태 반환하기  (0) 2023.10.28
        REST PUT vs PATCH  (0) 2023.10.22
        spring boot 3.1 docker compose support  (0) 2023.10.22
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바