2017-01-03 37 views
4

我正在使用WebView來顯示網頁,但服務器期望有來自我的webview的每個請求的授權令牌。有人知道這是可能的嗎? 我在#SO adding-header-to-all-request-with-retrofit-2中提到過這篇文章。但我無法得到結果。在webview中使用okhttp在webview中發送每個請求的授權標頭

這是我的代碼(裸與我的編碼標準,我是一個初學者)

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

任何幫助表示讚賞

編輯

現在我能得到服務器的響應,但在純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; 
       } 
      } 
     }; 
} 

,發現這在堆棧跟蹤,沒有什麼更多的堆棧跟蹤

E/DataReductionProxySettingListener: No DRP key due to exception:java.lang.ClassNotFoundException: com.android.webview.chromium.Drp 
+0

請發佈任何日誌,您收到的錯誤。也許仔細檢查一下,服務器不希望帶有Authentication值的前綴(「承載者」)。 – asadmshah

+0

@asadmshah到現在爲止沒有任何錯誤,我只是重新編輯了代碼,現在在webview中獲得純HTML,現在服務器正在獲取我的身份驗證令牌標頭。請參閱編輯問題 –

+0

@asadmshah只有登錄的用戶才能訪問網頁,我的PHP後端使用用戶的承載認證。所以我必須通過「Bearer」+ tokenValue來訪問網頁。 –

回答

4

最後這會糾正HTML渲染問題(對不起,我沒前面注意到這一點)。

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

text/html變化content-type,所以新的代碼是

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

如果我的解決方案需要進行任何修改,隨意編輯。始終接受更好的解決方快樂的編碼......並感謝大家#SO隨時提供幫助。

相關問題