개발 기록
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
반응형