Jetty:找出用于传入请求的连接器

时间:2014-09-05 16:49:17

标签: java servlets jetty embedded-jetty

处理Jetty响应时,我想知道请求源自哪个端口?

public static void main(String[] args) {
    Server server = new Server();
    server.setConnectors(new Connector[] {connectorUnsecure, connectorSecure});

    ServletContextHandler handler = new ServletContextHandler();
    handler.setContextPath("/");
    handler.addServlet(MyServlet.class, "/*");

    server.setHandler(handler);
    server.start();
    server.join();
}

public abstract class MyServlet extends HttpServlet {

    @Override
    protected final void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Find out on which connector port the request came from.
        // (The request.getRequestURL() does not contain the port at all times.)
    }
}

使用自定义处理程序时,我可以使用以下内容:

public class CustomHandler extends AbstractHandler {

    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        // baseRequest.getConnection().getConnector().getPort()
    }
}

但是,我不想使用自定义处理程序。

使用普通的HttpServlet时是否可以获取连接器及其端口?

谢谢!

1 个答案:

答案 0 :(得分:3)

javax.servlet.http.HttpServletRequest上有5种可能对您有用的方法。

  • .getLocalAddr() - 正在处理请求的服务器地址(可以是IPv4或IPv6)
  • .getLocalPort() - 正在处理
  • 请求的服务器端口
  • .getRemoteAddr() - 正在处理请求的客户端地址(可以是IPv4或IPv6)
  • .getRemotePort() - 正在处理
  • 请求的客户端端口
  • .getHeader("Host") - 客户端认为与之通信的请求的HTTP主机(和端口)。 (HTTP规范的一部分,对虚拟主机特别有用)

注意:也可以通过.getRequestURI()方法获取HTTP请求主机标头。

String serverAddr = URI.create(request.getRequestURI()).getHost();