Ich muss JEDER Anfrage aus dem WebView benutzerdefinierte Header hinzufügen. Ich weiß, loadURL
hat den Parameter für extraHeaders
, aber diese werden nur auf die ursprüngliche Anfrage angewendet. Alle nachfolgenden Anforderungen enthalten nicht die Header. Ich habe mir alle Überschreibungen in angesehen WebViewClient
, aber nichts erlaubt das Hinzufügen von Headern zu Ressourcenanforderungen - onLoadResource(WebView view, String url)
. Jede Hilfe wäre wunderbar.
Danke, Ray
java
android
webkit
android-webview
Strahl
quelle
quelle
Antworten:
Versuchen
Erstellen Sie zum Hinzufügen von Headern zu Ressourcenladeanforderungen einen benutzerdefinierten WebViewClient und überschreiben Sie:
quelle
view.loadUrl("http://www.facebook.com", extraHeaders)
, gibt es mehrere Ressourcenanforderungen wie'http://static.fb.com/images/logo.png'
usw. von der Webansicht gesendet. Für diese Anforderungen werden die zusätzlichen Header nicht hinzugefügt. Und shouldOverrideUrlLoading wird bei solchen Ressourcenanforderungen nicht aufgerufen. Der Rückruf 'OnLoadResource' wird aufgerufen, es gibt jedoch derzeit keine Möglichkeit, Header festzulegen.WebViewClient.shouldInterceptRequest(android.webkit.WebView view, java.lang.String url)
Sie in der API .shouldInterceptRequest
Methode erreicht werden kann, können Sie bitte erklären, wie?Sie müssen jede Anforderung mit abfangen WebViewClient.shouldInterceptRequest abfangen
Bei jedem Abfangen müssen Sie die URL nehmen, diese Anfrage selbst stellen und den Inhaltsstrom zurückgeben:
Wenn Ihr Mindest-API-Ziel Stufe 21 ist , können Sie die neue shouldInterceptRequest verwenden, die Ihnen zusätzliche Anforderungsinformationen (z. B. Header) anstelle nur der URL bietet.
quelle
public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)
stattdessen mehr hierVielleicht ist meine Antwort ziemlich spät, aber sie deckt die API unter und über 21 ab.
Um Header hinzuzufügen, sollten wir jede Anfrage abfangen und eine neue mit den erforderlichen Headern erstellen .
Daher müssen wir die in beiden Fällen aufgerufene Methode shouldInterceptRequest überschreiben : 1. für API bis Stufe 21; 2. für API Level 21+
Wenn der Antworttyp verarbeitet werden soll, können Sie ihn ändern
zu
und Methode hinzufügen
quelle
Wie bereits erwähnt, können Sie dies tun:
Ich habe dies und das mit einem MVC-Controller getestet und das Berechtigungsattribut erweitert, um den Header zu überprüfen, und der Header ist vorhanden.
quelle
Das funktioniert bei mir:
Zuerst müssen Sie eine Methode erstellen, die Ihre Header zurückgibt, die Sie zur Anforderung hinzufügen möchten:
Zweitens müssen Sie WebViewClient erstellen:
Fügen Sie WebViewClient zu Ihrem WebView hinzu:
Hoffe das hilft.
quelle
loadUrl(String url, Map<String, String> additionalHttpHeaders)
bedeutet, zusätzliche Header hinzuzufügenSie sollten in der Lage sein, alle Ihre Header zu steuern, indem Sie loadUrl überspringen und Ihre eigene loadPage mit Javas HttpURLConnection schreiben. Verwenden Sie dann die loadData der Webansicht, um die Antwort anzuzeigen.
Es gibt keinen Zugriff auf die von Google bereitgestellten Header. Sie befinden sich in einem JNI-Aufruf tief in der WebView-Quelle.
quelle
Hier ist eine Implementierung mit HttpUrlConnection:
Beachten Sie, dass dies bei POST-Anforderungen nicht funktioniert, da WebResourceRequest keine POST-Daten bereitstellt. Es gibt eine Request Data - WebViewClient-Bibliothek, die eine JavaScript-Injection-Problemumgehung zum Abfangen von POST-Daten verwendet.
quelle
Das hat bei mir funktioniert. Erstellen Sie den folgenden WebViewClient und stellen Sie den Webclient auf Ihre Webansicht ein. Ich musste webview.loadDataWithBaseURL verwenden, da meine URLs (in meinem Inhalt) nicht die Basis-URL hatten, sondern nur relative URLs. Sie erhalten die URL nur dann korrekt, wenn mit loadDataWithBaseURL eine Basis-URL festgelegt wurde.
quelle
Sie können dies verwenden:
quelle
Ich bin auf das gleiche Problem gestoßen und habe es gelöst.
Wie bereits erwähnt, müssen Sie Ihren benutzerdefinierten WebViewClient erstellen und die Methode shouldInterceptRequest überschreiben.
Diese Methode sollte eine webView.loadUrl ausgeben, während eine "leere" WebResourceResponse zurückgegeben wird.
Etwas wie das:
quelle
Benutze das:
quelle