У меня есть 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();
}
}
}