-
Spring Boot. How to get custom header value using @RequestHeader개발 기록 2023. 8. 31. 18:58728x90
환경.
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반응형'개발 기록' 카테고리의 다른 글
Nextjs 14. how to add unsupported metadata (0) 2024.01.12 Spring boot. JPA Expecting a SELECT query (0) 2023.09.20 Spring Boot. GoogleIdTokenVerifier's parameters(HttpTransport, JsonFactory) : How to know that? (0) 2023.08.10 Spring Boot. @PathVariable with a dot(.) gets truncated (0) 2023.07.03 MySQL. 'Select tables optimized away' vs 'Using index' (0) 2023.06.30