개발 기록

Spring Boot. How to get custom header value using @RequestHeader

neunggu 2023. 8. 31. 18:58
728x90

환경.

spring boot 3.1.1

 

목표.

웹 필터에서 커스텀 헤더를 추가하고 컨트롤러에서 @RequestHeader를 이용해서 값을 가져온다.

 

시작.

웹 필터에서 커스텀 헤더를 추가하기 위해선 보통 MutableHttpServletRequest를 만들어서 사용할 것이다.

하지만 인터넷에 돌아다니는 보통 많이 쓰는 코드를 가져오면 컨트롤러에서  @RequestHeader를 이용해서 값을 가져오지 못할 것이다. 이유는 getHeaders()를 오버라이딩 하지 않은 코드이기 때문이다.

 

컨트롤러에서 @RequestHeader를 사용하고 디버깅을 걸어서 코드를 따라가보면

스프링이 getHeaders()에서 값을 가져오는 것을 알 수 있다.

(그 중에서도 coyoteRequest라는 변수에서 값을 꺼내온다.)

 

문제를 파악했으니 MutableHttpServletRequest 클래스에 코드를 추가해보자.

// MutableHttpServletRequest
@Override
public Enumeration<String> getHeaders(String name) {
    Set<String> set = new HashSet();
    if (customHeaders.keySet().contains(name)) {
        set.add(getHeader(name));
    }
    @SuppressWarnings("unchecked")
    Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaders(name);
    while (e.hasMoreElements()) {
        String n = e.nextElement();
        set.add(n);
    }
    return Collections.enumeration(set);
}

커스텀 헤더의 키셋에 찾으려는 키가 있으면 Set에 추가하고

혹시나 같은 키의 데이터가 프론트에서 넘어온 것이 있으면 그것도 추가한다.  (getHeaders 이기 때문)

 

추가로 필터와 컨트롤러의 코드이다.

// Filter
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws IOException, ServletException {
    try {
        MutableHttpServletRequest mutableHttpServletRequest = new MutableHttpServletRequest(request);
        mutableHttpServletRequest.putHeader("email", "abc@abc.com");
        filterChain.doFilter(mutableHttpServletRequest, response);
    } catch (Exception e) {
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        return;
    }
}

// Controller
@GetMapping
public ResponseEntity userInfo(@RequestHeader(value = "email") String email) {
    System.out.println(email);
    return ResponseEntity.ok(null);
}

 

컨트롤러에서 @RequestHeader로 값을 가져올 수 있을 것이다!!

 

코드는 깃에 있다.

https://github.com/neunggu/etc/tree/main/MutableHttpServletRequest-sample

 

참고.

https://wilddiary.com/adding-custom-headers-java-httpservletrequest/

 

728x90
반응형