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
相关产品推荐
相关产品推荐

