22

Android では、ネイティブ アプリが http:// (ローカル/ファイルではない) リクエストの CORS セキュリティ ポリシーを無効にすることを許可していますか?

私のネイティブ アプリでは、webview は、ローカル/ファイル システムではなく、http:// 経由でリモート html を表示します。これは、Web ブラウザー内と同じように CORS で制限されているようです。

回避策: 持っていないクロスドメインへの ajax リクエスト用のネイティブ js ブリッジAccess-Control-Allow-Origin: *は、私のクイックアンドダート ソリューションです。(クライアントの Cookie+IP は Web サービスによってチェックされるため、jsonp またはサーバー側プロキシはオプションではありません。)

アプリ内 Web ビューに対してこのポリシーを無効にすることはできますか?

「ネイティブ」アプリの Web ビューを制限するこの制限を js がバイパスできるようにする簡単なフラグがある場合は、お知らせください。

4

3 に答える 3

14

これは、Android API レベル 21 で可能になりました。次のような OPTIONS レスポンスを作成できます。

public class OptionsAllowResponse {
    static final SimpleDateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss", Locale.US);

    @TargetApi(21)
    static WebResourceResponse build() {
        Date date = new Date();
        final String dateString = formatter.format(date);

        Map<String, String> headers = new HashMap<String, String>() {{
            put("Connection", "close");
            put("Content-Type", "text/plain");
            put("Date", dateString + " GMT");
            put("Access-Control-Allow-Origin", /* your domain here */);
            put("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
            put("Access-Control-Max-Age", "600");
            put("Access-Control-Allow-Credentials", "true");
            put("Access-Control-Allow-Headers", "accept, authorization, Content-Type");
            put("Via", "1.1 vegur");
        }};

        return new WebResourceResponse("text/plain", "UTF-8", 200, "OK", headers, null);
    }
}

次に、次のように WebViewClient 実装から呼び出します。

    @Override
    @TargetApi(21)
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
            return OptionsAllowResponse.build();
        }

        return null;
    }

これは、API レベル 21 以降でのみ機能します。これは、OPTIONS 応答が WebResourceRequest から要求された HTTP メソッドを検査する必要があるためです。これは、API 21 以降でのみ利用可能です。

于 2015-12-02T02:50:05.317 に答える