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

Jetty 12中如何控制POST请求的301重定向行为?

解决Jetty 12 POST请求末尾无斜杠时的301重定向问题

这个301重定向是Jetty 12中ContextHandler的默认路径规范化行为导致的:当你注册的Context路径为/api/user/authenticate(末尾无斜杠),Jetty会将其视为"资源路径",而带斜杠的路径视为"目录路径"。对于POST、PUT这类非GET/HEAD/OPTIONS的请求方法,Jetty默认会触发301重定向到带斜杠的路径,GET请求则允许直接匹配。

解决方法

针对单个API端点禁用该重定向行为,只需给对应的ContextHandler设置setAllowNullPathInfo(true)即可:

修改后的代码示例

QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setName("web-server");

Server server = new Server(threadPool);

int acceptors = 1;
int selectors = 1;

HttpConnectionFactory httpConfig = new HttpConnectionFactory();
ServerConnector connector = new ServerConnector(server, acceptors, selectors, httpConfig);
connector.setHost("localhost");
connector.setPort(5000);
connector.setAcceptQueueSize(64);

server.addConnector(connector);

Handler.Sequence topLevelList = new Handler.Sequence();
ContextHandlerCollection apiContext = new ContextHandlerCollection();

topLevelList.addHandler(apiContext);
server.setHandler(topLevelList);

// 修改此处,添加setAllowNullPathInfo(true)
apiContext.addHandler(new ContextHandler(new Handler.Abstract() {
    @Override
    public boolean handle(Request request, Response response, Callback callback) throws Exception {
        System.out.println("The request method is: " + request.getMethod());
        callback.succeeded();
        return true;
    }
}, "/api/user/authenticate") {{
    // 禁用路径规范化导致的重定向
    setAllowNullPathInfo(true);
}});

server.start();
server.join();

验证测试

执行原curl命令:

curl -D - -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:5000/api/user/authenticate

此时会直接进入handle方法,不再返回301重定向。

补充说明

如果需要全局调整路径规范化行为,可以通过HttpConfiguration的setPathNormalized(false)来禁用全局路径规范化,但这种方式会影响所有请求路径的处理,针对单个ContextHandler设置更适合API场景的精细化控制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:15:05