yewanji 2024-03-09 14:57 采纳率: 36.3%
浏览 66
已结题

安卓webview 如何解决跨域问题

问题是这样的,我的安卓webview 使用file:// 加载html,本意是为了加快访问速度,但是发现file:// 开头的html,请求后台http 接口会跨域,请问有好的解决办法吗

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-09 14:58
    关注

    引自免费微信小程序:皆我百晓生

    在Android WebView中,由于安全策略限制,当加载本地file://协议的HTML文件并尝试请求后台HTTP接口时,确实会遇到跨域问题。为了解决这个问题,有以下几种方法:

    1. 设置WebView允许加载所有来源: 在初始化WebView时,可以调用WebSettings对象的setAllowFileAccessFromFileURLs()setAllowUniversalAccessFromFileURLs()方法来允许跨域访问。

      WebView webView = new WebView(this);
      WebSettings settings = webView.getSettings();
      settings.setJavaScriptEnabled(true);
      // 允许file协议的页面加载其他来源的内容
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
          settings.setAllowFileAccessFromFileURLs(true);
          settings.setAllowUniversalAccessFromFileURLs(true);
      }
      

      但请注意这种方法存在安全隐患,因为它放宽了对跨源资源共享(CORS)的限制。

    2. 使用自定义的WebViewClient: 自定义一个WebViewClient,并重写shouldInterceptRequest()方法,在这个方法里处理网络请求,绕过跨域限制。

      webView.setWebViewClient(new WebViewClient() {
          @Override
          public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
              if (url.startsWith("http")) { // 对于HTTP请求
                  try {
                      URL requestUrl = new URL(url);
                      HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
                      connection.setRequestMethod("GET");
                      connection.setRequestProperty("User-Agent", "Mozilla/5.0");
                      connection.setRequestProperty("Accept", "*/*");
                      // 设置允许跨域请求的头信息,例如:
                      connection.setRequestProperty("Access-Control-Allow-Origin", "*");
                      return new WebResourceResponse(connection.getContentType(), 
                                                      connection.getContentEncoding(), 
                                                      connection.getInputStream());
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
              return super.shouldInterceptRequest(view, url);
          }
      });
      
    3. 搭建本地Web服务器: 将你的HTML、CSS、JavaScript等静态资源放在一个本地的Web服务器上,如使用Android中的NanoHTTPD或第三方库如kotlinx-serialization-json-server,然后通过http://localhost:端口号/的形式加载网页,这样就可以避免跨域问题,因为它们都在同一个源下。

    4. 修改后端服务支持CORS: 如果可能的话,在后端服务器上配置CORS策略,允许从特定源或者任何源发起请求。

    总之,请根据实际场景选择合适的方法解决跨域问题,同时要注意安全性考虑。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月17日
  • 已采纳回答 3月9日
  • 创建了问题 3月9日

悬赏问题

  • ¥15 可以实现这个有不同背景颜色的九九乘法表吗?
  • ¥50 python写segy数据时出错2
  • ¥20 关于R studio 做精确稳定检验的问题!(语言-r语言)
  • ¥50 用贝叶斯决策方法,设计CAD程序
  • ¥20 关于#目标检测#的问题:(qq收集表到时间才能填写,填写的份数有上限)
  • ¥50 ZYNQ7020双核FLAHS烧写的问题
  • ¥20 ue 5 中想要实现第一人称人物左右行走摆动的效果,摄像头只向右摆动一次(关键词-结点)
  • ¥15 AD9164瞬时带宽1.8G,怎么计算出来?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除? HKEY_CLASSES_ROOT*\shellex\ContextMenuHandlers 没用
  • ¥15 服务器安装php5.6版本