스프링 MVC에서 요청 및 응답 헤더 설정 방법

스프링 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);
}

태그: Spring MVC HTTP headers ControllerAdvice RequestMapping RestTemplate

8월 11일 04:58에 게시됨