CORS和WebView在移动前端开发中的应用

背景

在移动前端开发中,经常需要使用 WebView 加载本地的 HTML 文件来实现一些简单的页面功能或者展示数据。然而,在这个过程中,我们可能会遇到一些跨域问题,特别是在涉及到 Cookies 的情况下。

CORS(跨域资源共享)

CORS 是一种机制,允许 Web 应用服务器进行跨域访问控制,从而使网页能够安全地访问其他域名下的资源。通常情况下,当浏览器执行某个跨源请求时,会发送一个预检请求 OPTIONS,如果服务器返回指定的头部信息,则浏览器才会继续发送正式的请求。

问题:如何在 WebView 中使用 CORS?

对于加载远程资源(http/https)的 WebView,由于默认开启了跨域访问,因此不会受到 CORS 的限制。但是,WebView 加载本地文件时,则需要设置允许跨域访问。

解决方案:设置 WebSettings.setAllowFileAccessFromFileURLs(true) 和 setAllowUniversalAccessFromFileURLs(true)

-----------------------------------------------------------
----------------------------------------------------------------

问题:如何在 WebView 中支持带有 cookie 和 credentials 的跨域访问?

在 WebView 加载远程资源时,如果需要带上 cookie 和 credentials,只需要设置 WebSettings.setAllowFileAccessFromFileURLs(true) 和 setAllowUniversalAccessFromFileURLs(true) 是不够的。我们还需要在服务器端设置 Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Access-Control-Allow-Headers 等 headers 信息。

但是,当 WebView 加载本地 HTML 文件时,则不存在这样的服务器设置,如何解决呢?

解决方案:使用 addJavascriptInterface 方法和 JavaScript 做中转

步骤如下:

  1. 在 WebView 中实现一个 JavaScript 接口,用于从 WebView 向 JavaScript 发送消息,并从 JavaScript 接收返回值。
----- -------- -
    --------------------
    ------ ---- ------------------ -------- -
        -- - ---------- --- ------- ------------
    -

    --------------------
    ------ ------ ---------------- -
        -- ---------------- ----------
        ------ ------- --------
    -
-
  1. 在加载 HTML 文件前,需要启用 JavaScript 和允许 JavaScript 访问 Java 对象。
-------------------------------------------------
---------------------------------- ----------- ------------
  1. 在 HTML 文件中编写 JavaScript 代码,调用上述接口。
-- - ---- ----
----------------------------------- --------

-- - ---- ----
--- ------ - ---------------------------------
  1. 在 JavaScript 中,可以通过 Ajax 或 fetch 等方式向服务器发送请求,从而实现跨域访问。
-------------------------------- -
    ------- ------
    ------------ ---------- -- -- ------ - -----------
-------------------------- -
    ------ ----------------
---------------------- -
    ------------------
---

总结

在移动前端开发中,我们经常需要使用 WebView 加载本地 HTML 文件。当需要进行跨域访问时,我们可以通过设置 WebSettings.setAllowFileAccessFromFileURLs(true) 和 setAllowUniversalAccessFromFileURLs(true) 来解决。但是,如果涉及到带有 cookie 和 credentials 的跨域访问,我们则需要通过 addJavascriptInterface 方法和 JavaScript 做中转来实现。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/30254