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

