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

Struts 1.0中移除/隐藏HttpResponse头:web.xml配置无效,求应用级方案

在Struts 1.0中移除/隐藏HTTP响应头的实现方案

嘿,针对Struts 1.0里移除/隐藏HTTP响应头的需求,我给你两个靠谱的实现方向——毕竟你说web.xml里的常规配置没生效,那咱们从应用层面入手解决:

方法一:自定义Servlet Filter(全局生效,推荐)

这种方式能对所有Struts请求生效,不用逐个修改Action,适合批量移除多个响应头。

步骤1:编写自定义Filter类

实现Servlet的Filter接口,在请求链中拦截并修改响应头:

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ResponseHeaderCleanerFilter implements Filter {
    private String targetHeaders;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从web.xml配置要移除的头,用逗号分隔多个头
        targetHeaders = filterConfig.getInitParameter("headersToRemove");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        
        // 拆分并移除指定响应头
        if (targetHeaders != null && !targetHeaders.isEmpty()) {
            String[] headerNames = targetHeaders.split(",");
            for (String header : headerNames) {
                String trimmedHeader = header.trim();
                // 两种方式双保险:设置为null + 主动移除
                httpResponse.setHeader(trimmedHeader, null);
                httpResponse.removeHeader(trimmedHeader);
            }
        }
        
        // 继续执行后续请求链(比如Struts的Dispatcher)
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 无需额外资源清理,空实现即可
    }
}

步骤2:在web.xml中配置Filter

注意:一定要把这个Filter放在Struts核心Dispatcher Filter的前面,确保它能优先处理响应对象:

<!-- 自定义响应头清理Filter -->
<filter>
    <filter-name>ResponseHeaderCleaner</filter-name>
    <filter-class>com.yourcompany.yourproject.ResponseHeaderCleanerFilter</filter-class>
    <!-- 配置要移除的响应头,比如Server、X-Powered-By等 -->
    <init-param>
        <param-name>headersToRemove</param-name>
        <param-value>Server,X-Powered-By</param-value>
    </init-param>
</filter>

<!-- 映射到所有Struts请求(*.do是Struts默认的请求后缀) -->
<filter-mapping>
    <filter-name>ResponseHeaderCleaner</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>

<!-- 你的Struts核心Dispatcher Filter配置 -->
<filter>
    <filter-name>action</filter-name>
    <filter-class>org.apache.struts.action.ActionServlet</filter-class>
    <!-- ... 其他Struts配置参数 ... -->
</filter>

方法二:在Struts Action中编程式处理(单个Action生效)

如果只是特定几个Action需要移除响应头,可以直接在Action的execute方法中操作HttpServletResponse对象:

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class YourTargetAction extends Action {
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        // 移除指定响应头
        response.setHeader("X-Powered-By", null);
        response.removeHeader("Server");
        
        // 你的业务逻辑代码...
        return mapping.findForward("success");
    }
}

额外注意事项

  • 部分容器(比如Tomcat)的Server头是硬编码的,仅通过应用层代码可能无法完全移除,这种情况下需要结合容器配置(比如Tomcat在server.xml中配置server=" "),但应用层的Filter/Action方式依然能处理大部分自定义或容器暴露的响应头。
  • 测试时建议用curl -I http://your-domain/your-action.do命令或浏览器开发者工具的网络面板,确认响应头是否已被移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:51:02