2010-09-08 31 views
25

Tôi đã một WebViewClient gắn liền với WebView tôi như vậy:Android - làm thế nào để đánh chặn một POST hình thức trong WebViewClient android trên mức API 4

webView.setWebViewClient(new MyWebViewClient()); 

Đây là triển khai thực hiện của tôi về MyWebViewClient:

private class MyWebViewClient extends WebViewClient { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     webView.loadUrl(url); 
     return true; 
    }  
} 

Tôi cung cấp cho WebView một URL để tải qua số loadUrl(). Nếu tôi có một liên kết (a href...) trong trang, phương pháp shouldOverrideUrlLoading của tôi được gọi và tôi có thể chặn nhấp chuột vào liên kết.

Tuy nhiên, nếu tôi có biểu mẫu có phương thức là POST, phương thức shouldOverrideUrlLoading không được gọi.

Tôi nhận thấy sự cố tương tự ở đây: http://code.google.com/p/android/issues/detail?id=9122 dường như đề xuất ghi đè postUrl trong số WebView của tôi. Tuy nhiên, API này chỉ khả dụng bắt đầu từ cấp API 5.

Tôi có thể làm gì nếu tôi đang ở cấp API 4? Có cách nào khác để chặn bài đăng biểu mẫu không?

+0

Bạn có thể thử ghi đè trên gọi lạiPageStarted trong WebViewClient. – bhups

+0

Cảm ơn. Tôi đã thử điều đó và nó hoạt động được, nhưng vấn đề là tôi không muốn trang của biểu mẫu tải - đó là một URL giả nên tôi sẽ nhận được trang lỗi trên trang web. Tôi đã làm việc xung quanh điều này bằng cách kiểm tra trong onPageStarted nếu URL khớp với URL biểu mẫu của tôi và nếu có, hãy xử lý điều này trong ứng dụng của tôi và sau đó yêu cầu webViewClient quay lại. Điều đó có hợp lý không? – manisha

+0

Bạn có tìm thấy giải pháp cho điều này không? – Sohaib

Trả lời

3

này được biết đến vấn đề, rằng shouldOverrideUrlLoading không bắt POST. Xem http://code.google.com/p/android/issues/detail?id=9122 để biết chi tiết.

Sử dụng GET! Cá nhân tôi đã thử sử dụng POST, vì tôi đã dự kiến ​​một số giới hạn của các tham số GET (tức là chiều dài của URL), nhưng tôi đã chuyển thành công 32.000 byte thông qua GET cục bộ mà không gặp bất kỳ sự cố nào.

+0

Tôi thực sự cần tìm giải pháp cho điều này. Bởi vì, trong trường hợp của tôi, nó không nằm trong tay tôi để chuyển sang GET. Tôi không thể hiểu làm thế nào nó bị bỏ lỡ trong Android. Nguyên nhân gì vậy. – boburShox

+0

Ghi đè 'postUrl' trong' webView'. Điều này có sẵn từ cấp API 5. –

+0

Tôi đã làm, không thành công. Không xử lý. – boburShox

2

Bạn có thực sự cần sử dụng POST không? Nếu bạn muốn xử lý formdata cục bộ, tại sao không có một đoạn javascript xử lý biểu mẫu và giao diện của bạn với mã java "nguyên gốc" bằng cách sử dụng addJavascriptInterface. Ví dụ.

WebView engine = (WebView) findViewById(R.id.web_engine);  
engine.getSettings().setJavaScriptEnabled(true); 
engine.addJavascriptInterface(new MyBridge(this), "bridge"); 
engine.loadUrl(...) 

Cầu của bạn có thể là bất kỳ lớp nào về cơ bản và bạn có thể truy cập trực tiếp vào phương thức từ javascript. Ví dụ.

public class MyBridge { 

    public MyBridge(Context context) { 
     // ... 
    } 

    public String doIt(String a, String b) { 
      JSONArray result = new JSONArray(); 
      result.put("Hello " + a); 
      result.put("Hello " + b); 
      return result.toString();  
    } 

HTML/Javascript có thể trông giống như:

<script type="text/javascript"> 
    $("#button").click(function() { 
     var a = $("#a").val(); 
     var b = $("#b").val(); 

     var result=JSON.parse(bridge.doIt(a, b)); 
     // ... 
    } 
</script> 

<input id="a"><input id="b"><button id="button">click</button> 
+0

Đó là giải pháp lý tưởng nhưng không may dường như không hoạt động trên bộ mô phỏng 2.3 và các điện thoại khác nhau của thế hệ đó.Hãy tìm VM bị lỗi với lỗi sau: JNI CẢNH BÁO: jarray 0x40533560 trỏ tới đối tượng không mảng (Ljava/lang/String;) Google để biết thêm thông tin – EtienneSky

-2

Tôi nghĩ bạn có thể ghi đè onLoadResource(WebView view, String url) từ WebViewClient. Hàm này được thêm vào API LEVEL 1.

Chức năng này được gọi khi WebView sẽ tải tài nguyên được chỉ định bởi url đã cho. Tài nguyên bao gồm js, css, iframe url được nhúng. Ví dụ về mã như sau:

@Override 
    public void onLoadResource(WebView view, String url) { 
     if (url.indexOf("http://www.example.com") != -1 && view != null) { 
      // open url in default browser 
      view.stopLoading(); 
      view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); 
     } 
    } 
+0

Trong câu hỏi, yêu cầu chặn yêu cầu POST không cố gắng tải tài nguyên. Cả hai đều khác nhau. – Gem

+0

Đối với những người thêm minuses vào phản hồi này: theo tiêu chuẩn HTTP, "tài nguyên" không chỉ là tệp (js, css, v.v.). "Tài nguyên" là bất kỳ điều gì mà URI trỏ tới. Ví dụ: các điểm cuối API cũng là các tài nguyên. – forallepsilon

Các vấn đề liên quan