Geoserver 2.20.0(i18n版)能否忽略capabilities请求无效语言参数返回默认语言?
GeoServer 2.20.0 WMS无效语言参数异常修复方案
该问题是GeoServer 2.20.x版本的已知逻辑缺陷:WMS GetCapabilities接口的国际化处理逻辑未对传入的无效/不支持语言参数做兜底处理,直接抛出异常。可通过以下三种方案修复:
方案1:升级官方修复版本
该问题在2.22.2及之后的正式版本中已被官方修复,新版本会自动对无效语言参数做回退处理,返回默认翻译配置对应的响应,无需额外修改,是成本最低的解决方案。
方案2:2.20.0版本本地适配
如果暂时无法升级版本,可通过修改核心逻辑处理:
- 源码直接修改核心类逻辑
找到org.geoserver.wms.GetCapabilities类的国际化参数处理代码,在获取LANGUAGE参数后增加合法性校验:校验参数值是否在系统已配置的支持语言列表内,不匹配则直接将语言变量赋值为空的默认语言标识,终止异常抛出逻辑。 - 自定义过滤器兜底
也可在GeoServer WEB模块新增自定义请求过滤器,对所有WMS的GetCapabilities请求做预处理:
// 过滤器核心逻辑片段 if (request.getRequestURI().contains("wms") && "GetCapabilities".equalsIgnoreCase(request.getParameter("REQUEST"))) { String lang = request.getParameter("LANGUAGE"); // 校验语言是否为支持的类型 if (lang != null && !isSupportedLanguage(lang)) { // 移除无效语言参数,后续逻辑自动走默认翻译 request.removeParameter("LANGUAGE"); } }
修改完成后重启GeoServer服务即可生效。
方案3:反向代理层参数过滤(无代码侵入)
无需修改GeoServer本身,在前置Nginx等反向代理服务中对请求参数做过滤:
对携带LANGUAGE参数的GetCapabilities请求,校验参数值是否在支持的语言白名单内,不在白名单的直接移除该参数,请求到GeoServer后会自动走默认逻辑返回内容,Nginx配置参考:
if ($arg_REQUEST ~* "^GetCapabilities$") { set $lang $arg_LANGUAGE; # 替换为你实际支持的语言列表 if ($lang !~* "^(zh-CN|en|fr)$") { rewrite ^(.*)$ $1? break; } }
内容的提问来源于stack exchange,提问作者Elena Grigoriou
相关产品推荐
相关产品推荐

