You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot中禁用X-Forwarded-Host等指定响应头?

在Spring Boot中禁用X-Forwarded-Host、X-Host、X-Forwarded-Server响应头

当然可以禁用这些响应头,你当前的Filter没生效,主要是因为只重写了setHeader方法,而Spring设置响应头可能会用到addHeader等其他方法,另外Filter的执行顺序也可能没优先于设置这些头的组件。下面是两种可行的解决方法:

方法一:直接禁用Spring的转发头处理(推荐)

如果这些头是由Spring自带的ForwardedHeaderFilter添加的,直接在配置文件中禁用该功能即可,从根源上阻止头被添加:

对于Spring MVC应用

在application.properties或application.yml中添加:

spring.mvc.forwarded-header-strategy=none

对于Spring WebFlux应用

spring.webflux.forwarded-header-strategy=none

方法二:自定义Filter拦截所有设置头的操作

如果禁用默认转发头策略不适用,就需要完善自定义Filter,覆盖所有可能设置头的方法,并确保Filter优先级最高:

完整Filter实现

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponseWrapper;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
import java.util.Set;

public class RemoveForwardHeadersFilter extends OncePerRequestFilter {

    private static final Set<String> FORBIDDEN_HEADERS = Set.of(
            "X-Forwarded-Host",
            "X-Host",
            "X-Forwarded-Server"
    );

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        filterChain.doFilter(request, new HttpServletResponseWrapper(response) {
            @Override
            public void setHeader(String name, String value) {
                if (!isForbiddenHeader(name)) {
                    super.setHeader(name, value);
                }
            }

            @Override
            public void addHeader(String name, String value) {
                if (!isForbiddenHeader(name)) {
                    super.addHeader(name, value);
                }
            }

            @Override
            public void setDateHeader(String name, long date) {
                if (!isForbiddenHeader(name)) {
                    super.setDateHeader(name, date);
                }
            }

            @Override
            public void addDateHeader(String name, long date) {
                if (!isForbiddenHeader(name)) {
                    super.addDateHeader(name, date);
                }
            }

            @Override
            public void setIntHeader(String name, int value) {
                if (!isForbiddenHeader(name)) {
                    super.setIntHeader(name, value);
                }
            }

            @Override
            public void addIntHeader(String name, int value) {
                if (!isForbiddenHeader(name)) {
                    super.addIntHeader(name, value);
                }
            }

            private boolean isForbiddenHeader(String name) {
                return FORBIDDEN_HEADERS.stream()
                        .anyMatch(forbidden -> forbidden.equalsIgnoreCase(name));
            }
        });
    }
}

注册Filter并设置最高优先级

创建配置类注册Filter,确保它在所有其他Filter之前执行:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<RemoveForwardHeadersFilter> removeForwardHeadersFilter() {
        FilterRegistrationBean<RemoveForwardHeadersFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new RemoveForwardHeadersFilter());
        registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registrationBean;
    }
}

内容的提问来源于stack exchange,提问作者Catalina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:24:25