2012-02-19 13 views
2

我有一个Java应用程序,打开浏览器并浏览到执行一些重定向的远程servlet。另外,java应用程序在开放端口上实例化Jetty服务器,并等待servlet将浏览器重定向到它。我已经验证了servlet指示浏览器重定向到的URL是正确的(即类似于http://localhost:54321/callback),但我从来没有在实现接收重定向的具体AbstractHandler的请求处理程序中遇到断点。我在Windows环境下运行,但我不知道这是什么引起我的悲哀......在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(); 
     } 
    } 
} 
+0

如果您直接从浏览器访问http:// localhost:54321/callback,您是否在击中断点? – Santosh 2012-02-19 04:49:15

+0

不幸的是,不 - 我曾尝试过,但无济于事...... – hatboyzero 2012-02-19 14:10:39

回答

1

挖得更深一些后,我意识到我需要让当前线程LocalServerReceiver对象监视器的所有者调用java.lang.Object.wait(前),像这样

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

一旦我这样做,码头开始按预期运行。