У меня есть компонент WebView в действии, и при использовании loadUrl (initialUrl) я хочу добавить настроенный файл cookie. При добавлении cookie он возвращает ответ html-страницы, скажем, A, а внутри страницы A он публикует другой URL-адрес с cookie в качестве скрытой переменной на странице A. Вот код:
public class WebViewActivity extends FragmentActivity {
private WebView mWebView;
String test_url = "https://myexample.com/oamfed/idp/initiatesso";
String cookieString = "cookieName=cookieValue" + "; path=/";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWebView = (WebView) findViewById(R.id.webViewId);
loadData();
}
private void loadData(){
mWebView.invalidate();
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new WebViewClient(){
// Handle API until level 21
@SuppressWarnings("deprecation")
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return getNewResponse_new(url);
/*if(url.contains(test_url)) {
return getNewResponse_new(url);
}else{
return super.shouldInterceptRequest(view, url);
}*/
}
// Handle API 21+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
WebResourceResponse new_response = getNewResponse_new(url);
return new_response;
/*if(url.contains(test_url)) {
return getNewResponse_new(url);
}else{
return super.shouldInterceptRequest(view, url);
}*/
}
private WebResourceResponse getNewResponse_new(String url) {
String payload = "";
try {
//==
// Configure the GET request
//OkHttpClient httpClient = getHttpClient(url);
OkHttpClient httpClient = new OkHttpClient();
// Configure headers
Headers.Builder hb = new Headers.Builder();
hb.add("Content-Type", "application/JSON");
hb.add("Accept", "application/JSON");
hb.add("Cookie",cookieString);
System.out.println("------- WebViewActivity - calling : url => " + url);
Request httpGet = new Request.Builder()
.url(url)
.headers(hb.build())
.build();
Response httpResponse = httpClient.newCall(httpGet).execute();
if (!httpResponse.isSuccessful())
throw new IOException("Unexpected code: " + httpResponse);
payload = httpResponse.body().string();
WebResourceResponse new_response =
new WebResourceResponse(
httpResponse.header("content-type","text/plain"),
httpResponse.header("content-encoding", "utf-8"),
httpResponse.body().byteStream()
);
return new_response;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
});
mWebView.loadUrl(balance_url);
}
...
}
При отладке «полезная нагрузка» показывает, что из загруженного URL-адреса возвращается правильный ответ, что означает, что cookie успешно добавлен. Но после завершения выполнения этого метода переопределения:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
WebResourceResponse new_response = getNewResponse_new(url);
return new_response;
/*if(url.contains(test_url)) {
return getNewResponse_new(url);
}else{
return super.shouldInterceptRequest(view, url);
}*/
}
выдает эту ошибку в консоли:
E / InputStreamUtil: получено исключение при вызове available () для InputStream, возвращаемого из shouldInterceptRequest. Это приведет к сбою соответствующего запроса.
java.io.IOException: закрыто
на okio.RealBufferedSource $ 1.available (RealBufferedSource.java:438)
в org.chromium.android_webview.InputStreamUtil.available (InputStreamUtil.java:44)
Что-то не так при использовании WebResourceResponse в shouldInterceptRequest ()? Правильно ли я его использовал?
Спасибо
Shawn