HarmonyOS鸿蒙Next中webview加载的本地网页如何像Android一样拦截请求并给请求带上cookie?

HarmonyOS鸿蒙Next中webview加载的本地网页如何像Android一样拦截请求并给请求带上cookie? webview加载的本地网页 网页中会有需要带上cookie的请求 如何像android一样拦截请求并给请求带上cookie呢

3 回复
// 可以参考
// xxx.ets
import { webview } from '@kit.ArkWeb';
// xxx.ets
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();
  responseResource: WebResourceResponse = new WebResourceResponse();
  
  build() {
    Column() {
      Web({ src: "http://localhost:3000/login", controller: this.controller })
        .onInterceptRequest((event) => {
          // 拦截页面请求
          if (event?.request.getRequestUrl() == 'http://localhost:3000/login') {
            webview.WebCookieManager.configCookieSync('http://localhost:3000/login', 'a=b,c=d,e=n');
          }
          return null;
        })
    }
  }
}

// 直接在 aboutToAppear设置
aboutToAppear():void {
  webview.WebCookieManager.configCookieSync(
    'http://localhost:3000/login',
    'a=b,c=d,e=12'
  );
}
请求有cookie

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();
  responseResource: WebResourceResponse = new WebResourceResponse();
  
  aboutToAppear(): void {
    webview.WebCookieManager.configCookieSync('http://localhost:3000/login', 'a=b,c=d,e=442');
  }
  
  build() {
    Column() {
      Button('getCookie')
        .onClick(() => {
          try {
            let value = webview.WebCookieManager.fetchCookieSync('http://localhost:3000');
            console.log("fetchCookieSync cookie = " + value);
          } catch (error) {
            console.error(`ErrorCode: ${(error as BusinessError).code},  Message: ${(error as BusinessError).message}`);
          }
        })
      Web({ src: "http://localhost:3000/a", controller: this.controller })
        .onInterceptRequest((event) => {
          // 拦截页面请求
          if (event?.request.getRequestUrl() == 'http://localhost:3000/a') {
            let response = new WebResourceResponse()
            // 构造响应数据,如果本地文件在rawfile下,可以通过如下方式设置
            response.setResponseData($rawfile("index.html"));
            response.setResponseEncoding('utf-8');
            response.setResponseMimeType('text/html');
            response.setResponseCode(200);
            response.setReasonMessage('OK');
            response.setResponseIsReady(true);
            return response;
          }
          return null;
        })
    }
  }
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<button type="button" onclick="htmlAjax()">Click Me!</button>
<script>
function htmlAjax() {
  let xhr = new XMLHttpRequest();

  // 监听onreadystatechange事件,当请求的状态发生变化时触发
  xhr.onreadystatechange = function() {
    // 当请求完成且成功时(readyState为4,status为200)
    if (xhr.readyState == 4 && xhr.status === 200) {
      // 获取响应数据
      let res = JSON.parse(xhr.responseText);
      // 这里可以处理响应数据
    }
  };

  // 设置请求方法和URL,true表示异步
  xhr.open('GET', 'http://localhost:3000/login', true);
  // 发送请求
  xhr.send();
}
</script>
</body>
</html>

更多关于HarmonyOS鸿蒙Next中webview加载的本地网页如何像Android一样拦截请求并给请求带上cookie?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,WebView加载本地网页时拦截请求并带上Cookie,可以通过使用WebViewClientshouldInterceptRequest方法实现。具体步骤如下:

  1. 创建WebViewClient子类:继承WebViewClient并重写shouldInterceptRequest方法。
  2. 拦截请求:在shouldInterceptRequest方法中,你可以捕获请求的URL,并根据需要修改请求头,添加Cookie。
  3. 设置WebViewClient:将自定义的WebViewClient设置给WebView

示例代码如下:

class CustomWebViewClient : WebViewClient() {
    override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
        val url = request?.url?.toString()
        if (url != null) {
            // 添加Cookie到请求头
            val headers = request.requestHeaders.toMutableMap()
            headers["Cookie"] = "your_cookie_here"
            return super.shouldInterceptRequest(view, request)
        }
        return super.shouldInterceptRequest(view, request)
    }
}

// 在Activity中设置WebViewClient
val webView = findViewById<WebView>(R.id.webview)
webView.webViewClient = CustomWebViewClient()

在HarmonyOS鸿蒙Next中,可以通过WebViewsetWebViewClient方法拦截请求,并利用CookieManager管理Cookie。具体步骤如下:

  1. 设置WebViewClient:重写shouldInterceptRequest方法拦截请求。
  2. 管理Cookie:使用CookieManagersetCookie方法为请求添加Cookie。
  3. 加载网页:在shouldInterceptRequest中处理请求并添加Cookie后,继续加载网页。
WebView webView = findViewById(R.id.webview);
webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        // 添加Cookie
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setCookie(request.getUrl().toString(), "your_cookie_key=your_cookie_value");
        
        // 继续加载请求
        return super.shouldInterceptRequest(view, request);
    }
});

webView.loadUrl("file:///android_asset/local_page.html");
回到顶部