如何移除WebSphere Liberty与Open Liberty响应的Content-Language头
解决方案
你之前尝试的直接调用response.setLocale(Locale.ROOT)和普通Filter拦截不生效的原因是:Liberty的Web容器内核会在Servlet业务逻辑处理完成、响应提交到网络层之前,统一追加默认的Content-Language头,这个操作发生在应用级的Filter执行之后,所以应用层直接修改响应的操作会被覆盖。以下是两种经过验证的可行方案:
方法1:通过server.xml配置全局移除响应头(推荐)
无需修改应用代码,直接修改Liberty服务器配置即可全局生效,同时支持WebSphere Liberty和Open Liberty所有版本:
- 打开服务器的
server.xml配置文件,在<featureManager>节点中添加响应头管理特性:
<featureManager> <!-- 其他已有特性 --> <feature>responseHeader-1.0</feature> </featureManager>
- 在
server.xml的根节点下添加头移除配置:
<header id="removeContentLanguage" name="Content-Language" operation="remove"/>
配置完成后重启服务器即可,所有响应会自动移除Content-Language头。
方法2:使用ServletResponseWrapper包装响应实现应用级拦截
如果你只需要针对单个应用生效,不想修改全局服务器配置,可以通过自定义Filter配合响应包装类实现:
- 实现自定义Filter和响应包装类,拦截所有Content-Language头的写入操作:
import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; import java.io.IOException; import java.util.Locale; public class RemoveContentLanguageFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponseWrapper wrappedResp = new HttpServletResponseWrapper((HttpServletResponse) response) { @Override public void setHeader(String name, String value) { if (!"Content-Language".equalsIgnoreCase(name)) { super.setHeader(name, value); } } @Override public void addHeader(String name, String value) { if (!"Content-Language".equalsIgnoreCase(name)) { super.addHeader(name, value); } } @Override public void setLocale(Locale loc) { // 直接固定为ROOT_LOCALE,避免容器触发默认头写入 super.setLocale(Locale.ROOT); } }; chain.doFilter(request, wrappedResp); } }
- 在应用的
web.xml中配置Filter拦截所有请求,优先级设置为最高:
<filter> <filter-name>removeContentLanguageFilter</filter-name> <filter-class>com.example.RemoveContentLanguageFilter</filter-class> </filter> <filter-mapping> <filter-name>removeContentLanguageFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
注意:如果你的应用存在主动设置Content-Language的业务场景,需要调整上述拦截逻辑,避免误删自定义的合法头。
内容的提问来源于stack exchange,提问作者Takakiyo
相关产品推荐
相关产品推荐

