스프링 MVC에서 동적으로 HTTP 헤더를 조작하는 다양한 기법을 소개합니다. 주요 방식은 요청 헤더 처리와 응답 헤더 생성으로 나뉩니다.
요청 헤더 조작
@RequestHeader 어노테이션 사용
요청 파라미터로 특정 헤더 값을 추출할 수 있습니다.
@RequestMapping("/sample")
public String processRequest(@RequestHeader(name = "Custom-Tag", required = false) String tagValue) {
// 태그 값 활용
return "view";
}
컨트롤러 어드바이스 활용
전역적으로 응답 헤더를 추가할 수 있습니다.
@ControllerAdvice
public class GlobalHeaderConfig {
@AfterReturning
public void setCommonHeader(HttpHeaders headers) {
headers.set("X-Shared-Header", "SampleValue");
}
}
요청 매핑 속성 설정
@RequestMapping의 headers 매개변수를 통해 요청 조건을 지정할 수 있습니다.
@GetMapping(value = "/data", headers = "Custom-Header=Test")
public String handleData() {
// 특정 헤더 조건에 맞는 요청 처리
}
HttpServletRequest 접근
요청 객체를 통해 헤더 값을 확인할 수 있습니다.
@RequestMapping("/info")
public String getHeaderInfo(HttpServletRequest req) {
String value = req.getHeader("Custom-Header");
// 값 사용
return "result";
}
요청 인터셉터 구현
클라이언트 요청 전에 헤더를 수정할 수 있습니다.
public class HeaderModifier implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
request.getHeaders().set("X-Dynamic-Header", "Generated");
return execution.execute(request, body);
}
}
필터를 통한 헤더 처리
요청 전달 전후에 헤더를 조작할 수 있습니다.
public class HeaderInjector implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
HttpServletRequest req = (HttpServletRequest) request;
req.setAttribute("X-Custom-Header", "InjectedValue");
chain.doFilter(request, response);
}
}
리스트템플릿 커스터마이징
외부 서비스 호출 시 헤더를 동적으로 설정합니다.
HttpHeaders header = new HttpHeaders();
header.set("X-Request-Tag", dynamicValue);
HttpEntity<String> entity = new HttpEntity<>("Content", header);
restTemplate.postForEntity("url", entity, String.class);
응답 헤더 생성
@ResponseHeader 어노테이션 사용
컨트롤러 레벨에서 응답 헤더를 정의할 수 있습니다.
@Controller
@ResponseHeader("X-App-Header: GeneratedValue")
public class SampleController {
// 메서드 정의
}
HttpServletResponse 직접 조작
응답 객체를 통해 헤더를 설정합니다.
@RequestMapping("/output")
public String generateResponse(HttpServletResponse res) {
res.setHeader("X-Output-Header", "Value");
return "output";
}
ResponseEntity 활용
완전한 응답 구조를 생성할 수 있습니다.
@RequestMapping("/response")
public ResponseEntity<String> createResponse() {
HttpHeaders header = new HttpHeaders();
header.set("X-Custom-Header", "Dynamic");
return new ResponseEntity<>("Data", header, HttpStatus.CREATED);
}
인터셉터를 통한 후처리
요청 처리 후 응답 헤더를 추가합니다.
public class ResponseInterceptor implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
response.setHeader("X-Generated-Header", "FinalValue");
}
}
필터를 통한 응답 조작
요청 처리 완료 후 헤더를 설정합니다.
public class ResponseHeaderFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
chain.doFilter(request, response);
HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("X-Response-Tag", "Processed");
}
}
리액티브 클라이언트 호출
비동기 처리 시 헤더를 동적으로 적용합니다.
public Mono> callService(Data data) {
return webClient.get()
.uri("/api")
.header("X-Request-Id", generateId())
.retrieve()
.bodyToMono(String.class);
}