Я использую WebView для отображения веб-страницы, но сервер ожидает маркер авторизации с каждым запросом из моего веб-представления. Кто-нибудь знает, возможно ли это? Я отправил это сообщение в #SO adding-header-to-all-request-with-retrofit-2. Но я не могу получить результат.Отправить заголовок авторизации с каждым запросом в webview с использованием okhttp в android
Это мой код (голый с моим стандартом кодирования, я новичок)
public class TableViewTest extends AppCompatActivity {
ScrollView scrollView;
WebView webView;
SharedPreferences pref;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_table_view_test);
//final ProgressDialog pd = ProgressDialog.show(this, "", "Loading...", true);
webView = (WebView) findViewById(R.id.webView1Id)
webView.setVerticalScrollBarEnabled(true);
webView.setHorizontalScrollBarEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.setWebViewClient(new WebViewClient() {
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//return true load with system-default-browser or other browsers, false with your webView
pref = getSharedPreferences("app", Context.MODE_PRIVATE);
final String acToken = pref.getString("token", "DEFAULT");
HashMap<String, String> headerMap = new HashMap<>();
//put all headers in this header map
headerMap.put("Authorization", acToken);
view.loadUrl(url, headerMap);
return false;
}
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
});
webView.loadUrl("myurl");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
webView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
webView.restoreState(savedInstanceState);
}
public WebViewClient getWebViewClientWithCustomHeader(){
pref = getSharedPreferences("app", Context.MODE_PRIVATE);
final String acToken = pref.getString("token", "DEFAULT");
return new WebViewClient() {
@SuppressWarnings("deprecation")
public WebResourceResponse shouldInterceptRequest(WebView view, String url){
try {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).addHeader("Authorization" , "Bearer " + acToken)
.build();
Response response = okHttpClient.newCall(request).execute();
return new WebResourceResponse(response.header("content-type", response.body().contentType().type()), // You can set something other as default content-type
response.header("content-encoding", "utf-8"), // Again, you can set another encoding as default
response.body().byteStream());
} catch (ClientProtocolException e) {
//return null to tell WebView we failed to fetch it WebView should try again.
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
};
}
}
Любая помощь приветствуется
EDIT
Теперь я могу получить сервер, но в простом html, а не в рендеринге css правильно, не знаю, почему.
Вот новый код,
public class TableViewTest extends AppCompatActivity {
ScrollView scrollView;
WebView webView;
SharedPreferences pref;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_table_view_test);
//final ProgressDialog pd = ProgressDialog.show(this, "", "Loading...", true);
String url = "myurl";
pref = getSharedPreferences("app", Context.MODE_PRIVATE);
webView = (WebView) findViewById(R.id.webView1Id);
webView.setVerticalScrollBarEnabled(true);
webView.setHorizontalScrollBarEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.setWebViewClient(wvc);
webView.loadUrl("myurl");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
webView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
webView.restoreState(savedInstanceState);
}
public WebViewClient wvc = new WebViewClient() {
@SuppressWarnings("deprecation")
public WebResourceResponse shouldInterceptRequest(WebView view, String url){
try {
final String acToken = pref.getString("token", "DEFAULT");
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(url).addHeader("Authorization" , "Bearer " + acToken)
.build();
Response response = okHttpClient.newCall(request).execute();
return new WebResourceResponse(response.header("content-type", response.body().contentType().type()), // You can set something other as default content-type
response.header("content-encoding", "utf-8"), // Again, you can set another encoding as default
response.body().byteStream());
} catch (ClientProtocolException e) {
//return null to tell WebView we failed to fetch it WebView should try again.
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
};
}
И нашел в StackTrace, больше ничего в StackTrace
E/DataReductionProxySettingListener: No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp
Пожалуйста, разместите любые журналы, которые вы получите. Возможно, дважды проверьте, что сервер не ожидает префикс («несущий») с помощью параметра «Аутентификация». – asadmshah
@asadmshah до сих пор нет ошибки, я только что редактировал код и теперь получаю простой HTML-код в webview, и теперь сервер получает мой заголовок маркера auth. Пожалуйста, см. Редактирование в вопросе –
@asadmshah Только зарегистрированный пользователь может получить доступ к веб-странице, мой php-сервер использует аутентификацию на предъявителя для пользователей. Поэтому я должен передать «Bearer» + tokenValue для доступа к веб-странице. –