我正在嘗試爲使用webview訪問單個網站的JavaFX應用程序編寫自己的協議處理程序。什麼到目前爲止,我已經做了自定義JavaFX WebView協議處理程序
我定製URLStreamHandlerFactory
public class MyURLStreamHandlerFactory implements URLStreamHandlerFactory {
public URLStreamHandler createURLStreamHandler(String protocol) {
System.out.println("Protocol: " + protocol);
if (protocol.equalsIgnoreCase("http") || protocol.equalsIgnoreCase("https")) {
return new MyURLStreamHandler();
} else {
return new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
}
};
}
};
}
}
}
我定製的URLStreamHandler
public class MyURLStreamHandler extends java.net.URLStreamHandler{
protected HttpURLConnection openConnection(URL u){
MyURLConnection q = new MyURLConnection(u);
return q;
}
}
我定製HttpURLConnection的
public class MyURLConnection extends HttpURLConnection {
static int defaultPort = 443;
InputStream in;
OutputStream out;
Socket s;
publicMyURLConnection(URL url) {
super(url);
try {
setRequestMethod("POST");
} catch (ProtocolException ex) {
ex.printStackTrace();
}
}
public void setRequestProperty(String name, String value){
super.setRequestProperty(name, value);
System.out.println("Namee: " + name);
System.out.println("Value: " + value);
}
public String getRequestProperty(String name){
System.out.println("GET REQUEST: ");
return super.getRequestProperty(name);
}
public OutputStream getOutputStream() throws IOException {
OutputStream os = super.getOutputStream();
System.out.println("Output: " + os);
return os;
}
public InputStream getInputStream() throws IOException {
InputStream is = super.getInputStream();
System.out.println("INout stream: " + is);
return is;
}
@Override
public void connect() throws IOException {
}
@Override
public void disconnect() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean usingProxy() {
throw new UnsupportedOperationException("Not supported yet.");
}
當我運行的應用程序,我得到以下錯誤althouhg它似乎設置了一些標頭
Jul 08, 2013 11:09:04 AM com.sun.webpane.webkit.network.URLLoader doRun
WARNING: Unexpected error
java.net.UnknownServiceException: protocol doesn't support input
at java.net.URLConnection.getInputStream(URLConnection.java:839)
at qmed.QMedURLConnection.getInputStream(MyURLConnection.java:67)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at com.sun.webpane.webkit.network.URLLoader.receiveResponse(URLLoader.java:383)
at com.sun.webpane.webkit.network.URLLoader.doRun(URLLoader.java:142)
at com.sun.webpane.webkit.network.URLLoader.access$000(URLLoader.java:44)
at com.sun.webpane.webkit.network.URLLoader$1.run(URLLoader.java:106)
at com.sun.webpane.webkit.network.URLLoader$1.run(URLLoader.java:103)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.webpane.webkit.network.URLLoader.run(URLLoader.java:103)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
我想要做的就是獲取給定請求的響應並讀取它的二進制數據。我希望協議的行爲與缺省協議的行爲完全相同,並只檢查給定響應的二進制數據。我究竟做錯了什麼?
該應用程序正在做URLConnections的所有短路。當協議是http或https時,使用HTTPURLConnection作爲我的自定義URLConnection類並且在使用其他協議時像我在MyURLStreamHandlerFactory中使用時啓動默認的URLStreamHandler,是正確的嗎?我應該只擴展MYURLConnection中的默認URLConnection類來處理所有協議相同嗎?
任何幫助將非常感激,因爲這是一個項目威脅的問題
謝謝
很好的答案。到目前爲止,我發現它離我的需求最近。但我想要的是捕獲所有協議。 HTTP,HTTPS,file://就像我們可以在開發者控制檯中看到所有請求一樣。 –
你想用這個做什麼?也許一個網絡嗅探器/分析器工具將做你想做的。 –
另一件可能有用的事情是使用FirebugLite:'' - 將此代碼嵌入您的WebView頁面,您可以在WebView中調試頁面。不幸的是,FBLite沒有網絡標籤。 –