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,可以通过使用WebViewClient
的shouldInterceptRequest
方法实现。具体步骤如下:
- 创建WebViewClient子类:继承
WebViewClient
并重写shouldInterceptRequest
方法。 - 拦截请求:在
shouldInterceptRequest
方法中,你可以捕获请求的URL,并根据需要修改请求头,添加Cookie。 - 设置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中,可以通过WebView
的setWebViewClient
方法拦截请求,并利用CookieManager
管理Cookie。具体步骤如下:
- 设置WebViewClient:重写
shouldInterceptRequest
方法拦截请求。 - 管理Cookie:使用
CookieManager
的setCookie
方法为请求添加Cookie。 - 加载网页:在
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");