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

HTTP400:GET请求在Wildfly 18上失效但在JBoss 7上运行正常

问题根因

这个问题核心是Wildfly 18默认使用的Undertow web容器对URL特殊字符的校验规则远严格于JBoss 7.1.1使用的JBoss Web(基于Tomcat7内核):

  • 你URL参数里的未编码竖线|属于Undertow默认拦截的非法URL字符,请求在进入Web容器层就直接返回400,根本不会转发到后端的Struts Servlet,所以你打的方法断点完全不会触发。
  • JBoss 7.1.1默认未开启这类严格的特殊字符校验,所以相同URL可以正常进入业务方法。

排查步骤

  1. 先查看Wildfly运行日志,搜索是否存在ILLEGAL_CHARACTERS_IN_QUERY、Invalid character found in the request target类的报错,确认是特殊字符校验触发的400错误。
  2. 确认应用在Wildfly上的上下文路径是否为xxx-yyy,和JBoss侧部署的上下文路径完全一致,排除上下文路径不匹配导致的400问题。
  3. 检查应用启动日志,确认Struts的Action映射配置无加载错误,排除Struts配置失效的可能性。

解决方案

临时兼容方案(无需修改业务代码)

修改Wildfly的Undertow监听器配置,放开对应特殊字符的校验限制:

  1. 打开Wildfly配置文件:单机模式打开standalone/configuration/standalone.xml,域模式打开对应域配置文件
  2. 定位到undertow子系统的http-listener配置段,新增allow-unescaped-characters-in-url和allowed-query-characters属性,加入需要放行的|字符,示例如下:
<subsystem xmlns="urn:jboss:domain:undertow:10.0" default-server="default-server" default-virtual-host="default-host" default-servlet-container="default" default-security-domain="other" statistics-enabled="${wildfly.undertow.statistics-enabled:${wildfly.statistics-enabled:false}}">
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"
            allow-unescaped-characters-in-url="|"
            allowed-query-characters="|"/>
        <!-- 其余配置保持不变 -->
    </server>
</subsystem>
  1. 重启Wildfly实例后再次访问URL验证即可。

永久规范方案(符合HTTP标准)

修改前端请求生成逻辑,对URL参数中的特殊字符做URL编码,|编码后为%7C,编码后的合法URL如下:

http://localhost:8080/xxx-yyy/contract/subPeriodBlockingPairsAction.do?target=prepareSubPeriodBlockPairs&contractIdSubPeriodId=416%7C837

该方案不需要修改容器配置,兼容性最强,也符合RFC 3986的URL规范要求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 03:24:05