Send authorization header with every request in webview using okhttp in android

I use WebView to display a webpage, but the server expects an authorization token with every request from my webview. Does anyone know if this is possible? I posted this post in #SO adding-header-to-all-request-with-retrofit-2 . But I can’t get the result.

This is my code (naked with my coding standard, I'm new)

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; } } }; } } 

Any help is appreciated

EDIT

Now I can get the server response, but in plain html, and not for rendering css correctly, I don’t know why.

Here is the new code,

  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; } } }; } 

And found this in stacktrace, nothing more in stacktrace

  E/DataReductionProxySettingListener: No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp 
+5
source share
1 answer

Finally, this will fix the html rendering problem (sorry, I haven't noticed this before).

change content-type to

 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()); 

to text/html , so the new code

 return new WebResourceResponse(response.header("text/html", 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()); 

If my solution needs any changes, feel free to edit. Always make the best decisions. Happy coding ... And thanks to everyone #SO ready to help.

+4
source

Source: https://habr.com/ru/post/1262210/


All Articles