最近在写过滤器时,对某些请求uri要进行请求转发,但是发现转发的uri新请求总是报Not Found,提示找不到资源。但是发现自己的uri没有拼接错。
最终在debug下,发现原来是因为我的服务在配置文件中设置了统一请求前缀,所以servlet层会在我新的uri前面在重复拼接前缀,导致最终uri错误。
如下
server:
port: 8000
servlet:
context-path: /llm-proxy #统一路径前缀
过滤器中:
uri = uri + "/sse";
log.info("actual uri is {}", uri);
httpRequest.getRequestDispatcher(uri).forward(httpRequest, response);
统一路径前缀在servlet层生效,所以过滤器和拦截器在转发时,会在新的uri前面也添加前缀,比如oldUri = “/llm-proxy/test”,日志中打印转发的新的uri:“/llm-proxy/test/sse”看起来是正确的,但是查看debug系统日志,其实正常新转发的uri是newUri = “/llm-proxy/llm-proxy/test/sse”,会重复拼接前缀。所以最终响应404 Not Found访问不到资源。