2017-01-03 6 views
4

Я использую 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 
+0

Пожалуйста, разместите любые журналы, которые вы получите. Возможно, дважды проверьте, что сервер не ожидает префикс («несущий») с помощью параметра «Аутентификация». – asadmshah

+0

@asadmshah до сих пор нет ошибки, я только что редактировал код и теперь получаю простой HTML-код в webview, и теперь сервер получает мой заголовок маркера auth. Пожалуйста, см. Редактирование в вопросе –

+0

@asadmshah Только зарегистрированный пользователь может получить доступ к веб-странице, мой php-сервер использует аутентификацию на предъявителя для пользователей. Поэтому я должен передать «Bearer» + tokenValue для доступа к веб-странице. –

ответ

4

Наконец это исправить HTML рендеринга вопрос (не Пардон, я не сделал обратите внимание на это раньше).

изменение content-type в

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, поэтому новый код

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 готовы помочь.

 Смежные вопросы

  • Нет связанных вопросов^_^