Причал в Windows - PullRequest
       11

Причал в Windows

2 голосов
/ 19 февраля 2012

У меня есть Java-приложение, которое открывает браузер и просматривает удаленный сервлет, который выполняет несколько перенаправлений.Кроме того, Java-приложение создает экземпляр Jetty Server на открытом порту и ожидает, пока сервлет перенаправит браузер на него.Я проверил, что URL, который сервлет инструктирует браузеру для перенаправления, является правильным (т.е. что-то вроде http://localhost:54321/callback),, но я никогда не достигаю точки останова в обработчике запросов конкретного AbstractHandler, который я реализовал для полученияЯ работаю в среде Windows, но я не уверен, что именно это вызывает у меня проблемы ...

Ниже приведена реализация LocalServerReceiver, которую я использую:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.AbstractHandler;

public class LocalServerReceiver {

    class CallbackHandler extends AbstractHandler {

        @Override
        public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException {

            if (!CALLBACK_PATH.equals(target)) {
                return;
            }

            writeLandingHtml(response);
            response.flushBuffer();
            ((Request) request).setHandled(true);
            String error = request.getParameter("error");
            if (error != null) {
                // TODO Do something.
            }
            synchronized (LocalServerReceiver.this) {
                LocalServerReceiver.this.notify();
            }
        }

        private void writeLandingHtml(HttpServletResponse response) throws IOException {
            response.setStatus(HttpServletResponse.SC_OK);
            response.setContentType("text/html");

            PrintWriter doc = response.getWriter();
            doc.println("<html>");
            doc.println("<body>");
            doc.println("<script type='text/javascript'>");
            doc.println("window.setTimeout(function() {");
            doc.println("    window.open('', '_self', ''); window.close(); }, 1000);");
            doc.println("if (window.opener) { window.opener.checkToken(); }");
            doc.println("</script>");
            doc.println("</body>");
            doc.println("</html>");
        }
    }

    private static final String CALLBACK_PATH = "/callback";

    private Server _server;

    public String getRedirectUrl() throws Exception {
        int port = getUnusedPort();
        _server = new Server(port);
        for (Connector c : _server.getConnectors()) {
            c.setHost("localhost");
        }
        _server.addHandler(new CallbackHandler());
        _server.start();
        return "http://localhost:" + port + CALLBACK_PATH;
    }

    public void waitForResponse() {
        try {
            wait();
        } catch (InterruptedException e) {
            // Should not happen
        }
    }

    public void stop() throws Exception {
        if (_server != null) {
            _server.stop();
            _server = null;
        }
    }

    private static int getUnusedPort() throws IOException {
        Socket s = new Socket();
        s.bind(null);
        try {
            return s.getLocalPort();
        } finally {
            s.close();
        }
    }
}

1 Ответ

1 голос
/ 21 февраля 2012

Покопавшись немного глубже, я понял, что нужно сделать текущий поток владельцем монитора объекта LocalServerReceiver, прежде чем вызывать java.lang.Object.wait (), например,

public void waitForResponse() {
    try {
        synchronized (LocalServerReceiver.this) {
            LocalServerReceiver.this.wait();
        }
    } catch (InterruptedException e) {
        // Should not happen
    }
}

Как толькоСделав это, Jetty начал работать как положено.

...