如何在Jetty中处理带自定义路径后缀的HTTP请求?
处理Jetty中根路径后带任意文本的请求
在Jetty中处理这类http://域名/任意文本的请求,有几种直接可行的方案,下面给出具体实现:
方案一:使用Servlet通配符映射
通过ServletContextHandler挂载一个匹配所有路径的Servlet,就能捕获所有根路径下的请求:
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RootPathHandler { public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); // 设置根上下文 server.setHandler(context); // 添加自定义Servlet,匹配所有路径 context.addServlet(new ServletHolder(new HttpServlet() { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // 获取根路径后的文本,比如请求"/stackoverflowIsBest"时,getPathInfo()返回"/stackoverflowIsBest" String pathText = req.getPathInfo(); if (pathText == null) { pathText = ""; // 处理直接访问根域名的情况 } // 这里写你的业务逻辑,比如返回处理结果 resp.setContentType("text/plain"); resp.getWriter().write("收到的路径文本:" + pathText.substring(1)); // 去掉开头的斜杠 } }), "/*"); server.start(); server.join(); } }
方案二:使用自定义ContextHandler
如果想用ContextHandler直接处理,也可以设置其上下文路径为"/",并自定义Handler处理请求:
import org.eclipse.jetty.server.*; import org.eclipse.jetty.util.Callback; public class CustomContextHandler { public static void main(String[] args) throws Exception { Server server = new Server(8080); ContextHandler context = new ContextHandler("/"); // 根上下文 context.setHandler(new Handler.Abstract() { @Override public boolean handle(Request request, Response response, Callback callback) throws Exception { // 获取请求URI的路径部分 String path = request.getUri().getPath(); String text = path.isEmpty() ? "" : path.substring(1); // 去掉开头的斜杠 // 处理请求并返回结果 response.setContentType("text/plain;charset=utf-8"); response.getWriter().write("处理的文本内容:" + text); callback.succeeded(); return true; } }); server.setHandler(context); server.start(); server.join(); } }
这两种方案都能捕获所有http://域名/任意文本格式的请求,你可以根据业务需求选择合适的方式。如果需要更复杂的路由规则,也可以结合Jetty的RewriteHandler扩展,但对于这种简单场景,上面的方案足够高效。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

