Java Servlet多路径占位符API配置:双参数时404报错解决
解决Servlet双路径占位符404错误及参数解析问题
问题根源
你的代码存在两个核心问题,直接导致404错误和参数解析失败:
- Servlet路径映射不规范:
@WebServlet("/organization/*/location/*")不符合Servlet路径匹配规则,*只能作为路径的最后一部分使用(比如/organization/*),夹在路径中间的*无法正确匹配请求,直接引发404。 - 路径参数索引取值错误:以请求
/organization/5/location/50为例,getPathInfo()返回/5/location/50,按/分割后得到数组["", "5", "location", "50"],原代码取pathInfo[2]和pathInfo[4],前者是字符串location而非组织ID,后者会直接触发数组越界。
修改后的代码
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/organization/*") public class LocationServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pathInfo = request.getPathInfo(); // 处理空路径情况 if (pathInfo == null || pathInfo.isEmpty()) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("Invalid URL"); return; } String[] pathSegments = pathInfo.split("/"); // 校验路径格式:必须是 /{orgId}/location/{locId},分割后数组长度为4 if (pathSegments.length == 4 && "location".equals(pathSegments[2])) { String organizationId = pathSegments[1]; String locationId = pathSegments[3]; // 这里编写业务逻辑,比如根据ID查询数据 response.getWriter().write("Organization ID: " + organizationId + ", Location ID: " + locationId); } else { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("Invalid URL"); } } }
修改说明
- 修正路径映射:将Servlet映射改为
/organization/*,确保所有以/organization/开头的请求都能匹配到当前Servlet。 - 调整参数解析逻辑:
- 增加空路径判断,避免空指针异常。
- 通过数组长度和
pathSegments[2]的值校验路径格式,确保请求符合/organization/{orgId}/location/{locId}的结构。 - 正确取值:
pathSegments[1]为组织ID,pathSegments[3]为地点ID,彻底解决参数错误和数组越界问题。
- 强化合法性校验:仅处理符合规范的路径请求,其他格式直接返回400错误,提升接口鲁棒性。
内容的提问来源于stack exchange,提问作者user1610132
相关产品推荐
相关产品推荐

