WebView基礎知識以及Androidx-WebKit的使用

文章目錄

  • 摘要
  • WebView基礎
    • 一、啟動調整模式
    • 二、WebChromeClient
    • 三、WebViewClient
    • 四、WebSettings
    • 五、WebView和Native交互
  • Androidx-WebKit
    • 一、啟動安全瀏覽服務
    • 二、設置代理
    • 三、安全的 WebView 和 Native 通信支持
    • 四、文件傳遞
    • 五、深色主題的支持
    • 六、JavaScript and WebAssembly執行引擎支持

摘要

文章主要分2部分:

  1. Webview的基礎相關知識:如調試基礎API、和原生交互等
  2. Androidx-WebKit 的使用: 如和原生的消息交互文件傳遞、以及啟動安全瀏覽等

WebView基礎

一、啟動調整模式

在開發過程中,我們可以啟用 WebView 的調試模式,以便在 Chrome DevTools 中查看 WebView 的內容、網絡請求等信息。

WebView.setWebContentsDebuggingEnabled(true)

調試界面 chrome://inspect/#devices

在這里插入圖片描述

二、WebChromeClient

WebChromeClient 是一個抽象基類,它的實例可以被傳遞給 WebView.setWebChromeClient() 方法,以處理與 JavaScript 交互和網頁元素相關的事件。

2.1 WebChromeClient一進度相關

  • onProgressChanged(WebView view, int newProgress): 當頁面加載進度改變時調用。newProgress參數表示當前頁面加載的百分比。

2.2 WebChromeClient-標題、圖標相關

  • onReceivedTitle(WebView view, String title): 當前頁面的標題已經被接收到時調用。title參數是新的標題。
  • onReceivedIcon(WebView view, Bitmap icon): 當前頁面的圖標已經被接收到時調用。icon參數是新的圖標。
  • onReceivedTouchIconUrl(WebView view, String url, boolean precomposed): 當網頁的觸摸圖標URL被接收到時調用。url參數是圖標的URL,precomposed參數表示圖標是否已經被合成。

2.3 WebChromeClient-權限相關

  • onPermissionRequest(PermissionRequest request): 當網頁請求一個權限時調用,例如攝像頭、麥克風等。你可以在這個方法中處理權限請求。
  • onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback): 當網頁請求獲取地理位置權限時調用。origin參數是請求權限的網頁的源,callback參數是用于設置權限的回調。
     override fun onPermissionRequest(request: PermissionRequest?) {"onPermissionRequest".logD(WEB_TAG)try {request?.let {kotlin.runCatching {if (isVideo(request.resources)) {startRequestPermissions(permissions = arrayOf(permission.CAMERA, permission.RECORD_AUDIO)) {if (it.filter { !it.value }.isEmpty()) {request.grant(request.resources)request.origin}}} else if (isOnlyAudio(request.resources)) {startRequestPermission(permission = permission.RECORD_AUDIO) {if (it) {request.grant(request.resources)request.origin}}}}}}catch (e :Exception){e.message.logE(WEB_TAG)}}private fun isVideo(resources: Array<String>): Boolean {val strings = listOf(*resources)return strings.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE)}private fun isOnlyAudio(resources: Array<String>): Boolean {val strings = listOf(*resources)return !strings.contains(PermissionRequest.RESOURCE_VIDEO_CAPTURE) && strings.contains(PermissionRequest.RESOURCE_AUDIO_CAPTURE)}}

2.4 WebChromeClient-文件處理

  • onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams): 當網頁需要用戶選擇文件時調用,例如HTML的元素被點擊時。你可以在這個方法中打開一個文件選擇器,并將用戶選擇的文件的URI通過filePathCallback返回。

2.5 WebChromeClient-彈窗、JS相關

  • onJsAlert(WebView view, String url, String message, JsResult result): 當JavaScript的alert()函數被調用時調用。message參數是alert()函數的參數。
  • onJsConfirm(WebView view, String url, String message, JsResult result): 當JavaScript的confirm()函數被調用時調用。message參數是confirm()函數的參數。
  • onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result): 當JavaScript的prompt()函數被調用時調用。message參數是prompt()函數的第一個參數,defaultValue參數是prompt()函數的第二個參數。
  • onConsoleMessage(ConsoleMessage consoleMessage): 當JavaScript的console.log()函數被調用時調用。consoleMessage參數包含了日志消息的詳細信息。
  • onJsBeforeUnload(WebView view, String url, String message, JsResult result): 當JavaScript的beforeunload事件被觸發時調用。message參數是beforeunload事件的返回值。
  • onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg): 當JavaScript的window.open()函數被調用時調用。你可以在這個方法中創建一個新的WebView,并將它通過resultMsg返回。
  • onCloseWindow(WebView window): 當JavaScript的window.close()函數被調用時調用。你可以在這個方法中關閉之前通過onCreateWindow創建的WebView。

2.6 WebChromeClient-視頻相關

  • onShowCustomView(View view, CustomViewCallback callback): 當網頁進入全屏模式時調用。在這種情況下,網頁內容將不再在WebView中渲染,而是在傳入的view中渲染。你應該將這個View添加到一個配置了WindowManager.LayoutParams.FLAG_FULLSCREEN標志的Window中,以實際全屏顯示這個網頁內容。
  • onHideCustomView(): 當網頁退出全屏模式時調用。你應該隱藏自定義的View(之前傳給onShowCustomView(View view, CustomViewCallback callback)的View)。在這個方法調用后,網頁內容將再次在原來的WebView中渲染。
  • getDefaultVideoPoster(): 當視頻元素不在播放狀態時,它們由一個’poster’圖像表示。可以通過HTML中的video標簽的poster屬性指定要使用的圖像。如果該屬性不存在,則使用默認的poster。這個方法允許ChromeClient提供默認的poster圖像。
  • getVideoLoadingProgressView(): 獲取在全屏視頻緩沖期間顯示的View。主應用程序可以覆蓋此方法以提供包含旋轉器或類似物的View。

三、WebViewClient

WebViewClient 是一個抽象基類,它的實例可以被傳遞給 WebView.setWebViewClient() 方法,以處理與網頁加載和渲染相關的事件。

3.1 WebViewClient-重定向

  • shouldOverrideUrlLoading(WebView view, String url): 當 WebView 即將加載一個 URL 時調用。你可以在這個方法中決定是否要覆蓋這個 URL 的加載,如果你想覆蓋這個 URL 的加載,那么你應該返回 true,并在這個方法中進行你自己的處理,例如打開一個新的 Activity 來加載這個 URL。

3.2 WebViewClient-頁面加載

  • onPageStarted(WebView view, String url, Bitmap favicon): 當網頁開始加載時調用。url 參數是正在加載的網頁的 URL。
  • onPageFinished(WebView view, String url): 當網頁加載完成時調用。url 參數是剛剛加載完成的網頁的 URL。
  • onLoadResource(WebView view, String url): 當 WebView 正在加載一個資源(例如圖片或者 JavaScript 文件)時調用。url 參數是正在加載的資源的 URL。

3.3 WebViewClient-認證請求相關

  • onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm): 當 WebView 需要進行 HTTP 認證時調用。你可以在這個方法中處理認證請求,例如顯示一個輸入用戶名和密碼的對話框。
  • onReceivedLoginRequest(WebView view, String realm, @Nullable String account, String args): 當 WebView 需要進行自動登錄時調用。你可以在這個方法中處理登錄請求,例如從存儲的賬戶信息中獲取用戶名和密碼。

3.4 WebViewClient-其他

  • onReceivedError(WebView view, int errorCode, String description, String failingUrl): 當 WebView 加載網頁時發生錯誤時調用。errorCode 參數是錯誤碼,description 參數是錯誤描述,failingUrl 參數是發生錯誤的網頁的 URL。
  • onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse): 當 WebView 接收到 HTTP 錯誤時調用。request 參數是發生錯誤的請求,errorResponse 參數是服務器的響應。
  • onReceivedSslError(WebView view, SslErrorHandler handler, SslError error): 當 WebView 加載的網頁有 SSL 錯誤時調用。你可以在這個方法中處理 SSL 錯誤,例如顯示一個對話框讓用戶決定是否要繼續加載。
  • onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback): 當 WebView 訪問一個被 Safe Browsing 判斷為可能是惡意的網站時被調用。你可以在這個方法中處理這個事件,例如顯示一個警告對話框,或者導航到一個安全的網頁。callback 參數是一個 SafeBrowsingResponse,你可以調用它的 showInterstitial(boolean) 或 proceed(boolean) 方法來決定是否顯示一個安全警告的插頁廣告,或者繼續加載這個網頁。
  • onFormResubmission(WebView view, Message dontResend, Message resend): 當 WebView 嘗試重新提交一個表單,并且需要用戶確認是否重新提交時調用。你可以在這個方法中處理這個事件,例如顯示一個確認對話框。
  • onScaleChanged(WebView view, float oldScale, float newScale): 當 WebView 的縮放級別改變時調用。你可以在這個方法中處理縮放級別的改變,例如更新一個縮放級別的顯示。
  • onUnhandledKeyEvent(WebView view, KeyEvent event): 當 WebView 收到一個未處理的按鍵事件時調用。你可以在這個方法中處理未處理的按鍵事件,例如實現自定義的按鍵處理。
  • doUpdateVisitedHistory(WebView view, String url, boolean isReload): 一個頁面的訪問歷史記錄被更新時,這個方法會被調用。

四、WebSettings

WebSettings 是一個類,它用于管理 WebView 的各種設置。你可以通過 WebView.getSettings() 方法獲取到一個 WebSettings 實例,然后通過這個實例來配置 WebView 的設置。

以下是一些常用的 WebSettings 方法:

  • setJavaScriptEnabled(boolean enabled): 設置 WebView 是否支持 JavaScript。默認值為 false
  • setSupportZoom(boolean support): 設置 WebView 是否支持縮放。默認值為 false
  • setDisplayZoomControls(boolean enabled): 設置 WebView 是否顯示縮放控件。默認值為 true
  • setBuiltInZoomControls(boolean enabled): 設置 WebView 是否使用內置的縮放機制。默認值為 false
  • setLoadWithOverviewMode(boolean overview): 設置 WebView 是否應該啟用概覽模式,即總是縮放內容以適應屏幕寬度。默認值為 false
  • setUseWideViewPort(boolean use): 設置 WebView 是否應該啟用寬視圖端口。默認值為 false
  • setJavaScriptCanOpenWindowsAutomatically(boolean allow): 設置 WebView 的 JavaScript 是否可以自動打開窗口。默認值為 false
  • setMediaPlaybackRequiresUserGesture(boolean require): 設置為 false,那么 WebView 中的音頻和視頻將會自動播放,不需要用戶交互。
  • setLoadsImagesAutomatically(boolean flag): 用于設置 WebView 是否自動加載圖片。 如果設置為 true,WebView 會自動加載網頁中的圖片。如果設置為 false,所有的圖片都不會被加載,只有當 LOAD_CACHE_ELSE_NETWORK 或 LOAD_NO_CACHE 被使用時,才會加載。

WebSettings 提供了一些方法來管理 WebView 的緩存:

  1. setCacheMode(int mode): 設置 WebView 的緩存模式。可選的值有:
    • LOAD_DEFAULT: 默認的緩存模式。如果沒有 Cache-ControlExpires 頭,緩存會被存儲,當資源過期時,WebView 會嘗試從網絡加載。如果沒有網絡,WebView 會從緩存加載。
    • LOAD_CACHE_ELSE_NETWORK: 只要緩存存在,即使過期也會從緩存加載。如果緩存不存在,WebView 會從網絡加載。
    • LOAD_NO_CACHE: 不使用緩存,WebView 會從網絡加載。
    • LOAD_CACHE_ONLY: 不從網絡加載,只從緩存加載。
  2. setAppCacheEnabled(boolean enabled): 設置 WebView 是否啟用應用緩存。默認值為 false。注意,你還需要通過 setAppCachePath 方法設置一個應用緩存的路徑。
  3. setAppCachePath(String appCachePath): 設置應用緩存的路徑。這個路徑必須是可以讓應用讀寫的。
  4. setAppCacheMaxSize(long appCacheMaxSize): 設置應用緩存的最大大小。
  5. setDatabaseEnabled(boolean enabled): 設置 WebView 是否啟用數據庫存儲 API。默認值為 false
  6. setDomStorageEnabled(boolean enabled): 設置 WebView 是否啟用 DOM 存儲 API。默認值為 falsetrue可以使用 sessionStorage 和 localStorage 對象來存儲和檢索數據。。
  //設置Cookiefun setCookie(map: MutableMap<String, String>) {val cookieManager: CookieManager = CookieManager.getInstance()cookieManager.setAcceptCookie(true)map.onEach { entry ->cookieManager.setCookie(entry.key, entry.value)}cookieManager.flush()}/*** 給設置localStorage 設置數據*/fun setLocalStorage(itmes: Map<String, String>) {val jsonBuf = StringBuilder()for (key in itmes.keys) {if (isNotEmpty(itmes[key])) {jsonBuf.append("localStorage.setItem('key', '").append(itmes[key]).append("');")}}val info = jsonBuf.toString()if (isNotEmpty(info)) {webView.evaluateJavascript(info, null)}}

五、WebView和Native交互

WebView 和 Native 交互主要有兩種方式:JavaScriptInterface 和 WebView.evaluateJavascript。

  1. JavaScriptInterface:這是一種將 Java 對象映射到 JavaScript 的方式。你可以創建一個 Java 對象,這個對象的公共方法可以在 JavaScript 中被調用。例如:
class JavaScriptInterface(private val context: Context) {@JavascriptInterfacefun showToast(message: String) {Toast.makeText(context, message, Toast.LENGTH_SHORT).show()}
}val webView: WebView = findViewById(R.id.webview)
webView.addJavascriptInterface(JavaScriptInterface(this), "Android")

在上述代碼中,我們創建了一個 JavaScriptInterface 類,并將其實例添加到了 WebView 中。

在 JavaScript 中:

Android.showToast(message);

WebView.evaluateJavascript:這是一種在 WebView 中執行 JavaScript 代碼的方式。你可以使用這個方法來調用 JavaScript 函數,并獲取返回值。例如:

webView.evaluateJavascript("document.title") { title ->Log.d("WebView", "Document title: $title")
}


Androidx-WebKit

dependencies {implementation("androidx.webkit:webkit:1.9.0")
}

這里下面就是WebKit對于的 WebView 的增強方法

一、啟動安全瀏覽服務

    /*** Start safe browsing* 用于啟動安全瀏覽服務。這個服務可以幫助 WebView 防止用戶訪問被認為是惡意的網站*/fun startSafeBrowsing(){if (WebViewFeature.isFeatureSupported(WebViewFeature.START_SAFE_BROWSING)) {WebViewCompat.startSafeBrowsing(BaseKit.app) {("WebView.startSafeBrowsing isSuccess = $it").logI()}}}

二、設置代理

if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) {ProxyConfig proxyConfig = new ProxyConfig.Builder().addProxyRule("localhost:7890") //添加要用于所有 URL 的代理.addProxyRule("localhost:1080") //優先級低于第一個代理,僅在上一個失敗時應用.addDirect()                    //當前面的代理失敗時,不使用代理直連.addBypassRule("www.baidu.com") //該網址不使用代理,直連服務.addBypassRule("*.cn")          //以.cn結尾的網址不使用代理.build();Executor executor = ...Runnable listener = ...ProxyController.getInstance().setProxyOverride(proxyConfig, executor, listener);

三、安全的 WebView 和 Native 通信支持

// Appval myListener = object : WebViewCompat.WebMessageListener {/*** On post message** @param view WebView* @param message js代碼發送的消息* @param sourceOrigin 發送消息的網頁地址* @param isMainFrame 是否是主頁面,iFrame中的頁面為false* @param replyProxy 回復消息的代理*/override fun onPostMessage(view: WebView, message: WebMessageCompat, sourceOrigin: Uri, isMainFrame: Boolean, replyProxy: JavaScriptReplyProxy) {// do something about view, message, sourceOrigin and isMainFrame.}}val allowedOriginRules = allowedRules ?: setOf()WebViewCompat.addWebMessageListener(/* webView = */ webView,/* jsObjectName = */jsObjectName,/* allowedOriginRules = */ allowedOriginRules,/* listener = */myListener)
// Web page (in JavaScript)
myObject.onmessage = function(event) {// prints "Got it!" when we receive the app's response.console.log(event.data);
}
myObject.postMessage("I'm ready!");

四、文件傳遞

4.1 Native 傳遞文件給 WebView:

// App (in Java)
WebMessageListener myListener = new WebMessageListener() {@Overridepublic void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,boolean isMainFrame, JavaScriptReplyProxy replyProxy) {// Communication is setup, send file data to web.if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_ARRAY_BUFFER)) {// Suppose readFileData method is to read content from file.byte[] fileData = readFileData("myFile.dat");replyProxy.postMessage(fileData);}}
}
// Web page (in JavaScript)
myObject.onmessage = function(event) {if (event.data instanceof ArrayBuffer) {const data = event.data;  // Received file content from app.const dataView = new DataView(data);// Consume file content by using JavaScript DataView to access ArrayBuffer.}
}
myObject.postMessage("Setup!");

4.2 WebView 傳遞文件給 Native:

// Web page (in JavaScript)
const response = await fetch('example.jpg');
if (response.ok) {const imageData = await response.arrayBuffer();myObject.postMessage(imageData);
}
// App (in Java)
WebMessageListener myListener = new WebMessageListener() {@Overridepublic void onPostMessage(WebView view, WebMessageCompat message, Uri sourceOrigin,boolean isMainFrame, JavaScriptReplyProxy replyProxy) {if (message.getType() == WebMessageCompat.TYPE_ARRAY_BUFFER) {byte[] imageData = message.getArrayBuffer();// do something like draw image on ImageView.}}
};

五、深色主題的支持

簡單來說如果您想讓 WebView 的內容和應用的主題相匹配,您應該始終定義深色主題并實現 prefers-color-scheme,而對于未定義 prefers-color-scheme 的頁面,系統按照不同的策略選擇算法生成或者顯示默認頁面。

六、JavaScript and WebAssembly執行引擎支持

JavascriptEngine 直接使用了 WebView 的 V8 實現,由于不用分配其他 WebView 資源所以資源消耗更低,并可以開啟多個獨立運行的沙箱環境,還針對傳遞大量數據做了優化。

if(!JavaScriptSandbox.isSupported()){
return;
}
//連接到引擎
ListenableFuture<JavaScriptSandbox> jsSandboxFuture =JavaScriptSandbox.createConnectedInstanceAsync(context);
//創建上下文 上下文間有簡單的數據隔離
JavaScriptIsolate jsIsolate = jsSandbox.createIsolate();
//執行函數 && 獲取結果
final String code = "function sum(a, b) { let r = a + b; return r.toString(); }; sum(3, 4)";
ListenableFuture<String> resultFuture = jsIsolate.evaluateJavaScriptAsync(code);
String result = resultFuture.get(5, TimeUnit.SECONDS);
Futures.addCallback(resultFuture,new FutureCallback<String>() {@Overridepublic void onSuccess(String result) {text.append(result);}@Overridepublic void onFailure(Throwable t) {text.append(t.getMessage());}},mainThreadExecutor); //Wasm運行
final byte[] hello_world_wasm = {0x00 ,0x61 ,0x73 ,0x6d ,0x01 ,0x00 ,0x00 ,0x00 ,0x01 ,0x0a ,0x02 ,0x60 ,0x02 ,0x7f ,0x7f ,0x01,0x7f ,0x60 ,0x00 ,0x00 ,0x03 ,0x03 ,0x02 ,0x00 ,0x01 ,0x04 ,0x04 ,0x01 ,0x70 ,0x00 ,0x01 ,0x05,0x03 ,0x01 ,0x00 ,0x00 ,0x06 ,0x06 ,0x01 ,0x7f ,0x00 ,0x41 ,0x08 ,0x0b ,0x07 ,0x18 ,0x03 ,0x06,0x6d ,0x65 ,0x6d ,0x6f ,0x72 ,0x79 ,0x02 ,0x00 ,0x05 ,0x74 ,0x61 ,0x62 ,0x6c ,0x65 ,0x01 ,0x00,0x03 ,0x61 ,0x64 ,0x64 ,0x00 ,0x00 ,0x09 ,0x07 ,0x01 ,0x00 ,0x41 ,0x00 ,0x0b ,0x01 ,0x01 ,0x0a,0x0c ,0x02 ,0x07 ,0x00 ,0x20 ,0x00 ,0x20 ,0x01 ,0x6a ,0x0b ,0x02 ,0x00 ,0x0b,
};
final String jsCode = "android.consumeNamedDataAsArrayBuffer('wasm-1').then(" +"(value) => { return WebAssembly.compile(value).then(" +"(module) => { return new WebAssembly.Instance(module).exports.add(20, 22).toString(); }" +")})";
boolean success = js.provideNamedData("wasm-1", hello_world_wasm);
if (success) {FluentFuture.from(js.evaluateJavaScriptAsync(jsCode)).transform(this::println, mainThreadExecutor).catching(Throwable.class, e -> println(e.getMessage()), mainThreadExecutor);
} else {// the data chunk name has been used before, use a different name
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11101.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ipa 功能包調試,分區算法,覆蓋算法測試

參考 wiki 流網絡 flow network 解釋 相關文章 ipa 分區算法 ipa 分區算法總結&#xff0c;部分算法圖解 環境 ubuntu20&#xff0c;ros 版本 noetic 運行測試 按照 readme 提示進行測試&#xff0c;跳過第一個步驟&#xff0c;并不需要 turtlebot3。 執行第三個 launch 報…

vue element checkbox的實現

實現多選非常簡單: 手動添加一個el-table-column&#xff0c;設type屬性為selection即可&#xff1b;默認情況下若內容過多會折行顯示&#xff0c;若需要單行顯示可以使用show-overflow-tooltip屬性&#xff0c;它接受一個Boolean&#xff0c;為true時多余的內容會在 hover 時以…

Java8 快速實現List轉map 、分組、過濾等操作

Java 8 是 Java 編程語言的一個重要版本&#xff0c;它引入了許多新特性和改進&#xff0c;使得 Java 開發變得更加高效和現代。 下面我們就來使用Java8 快速實現List轉map 、分組、過濾等操作。 定義1個用戶對象 public class User {private Integer id;private String nam…

計算機通信

一.進程和線程的區別? 1. 進程是資源分配的最小單位, 線程是cpu進行調度的最小單位。 2. 一個進程可以看做一個運行的程序, 一個進程中可以包含多個線程, 線程在進程內執行。 3. 多進程是指操作系統能同時運行多個任務&#xff08;程序&#xff09;&#xff0c;多線程是指在同…

數據挖掘原理與應用------分類預測

在數據挖掘和機器學習領域&#xff0c;TPR&#xff08;True Positive Rate&#xff09;是指在實際為陽性的情況下&#xff0c;模型正確預測為陽性的比例。TPR也被稱為靈敏度&#xff08;Sensitivity&#xff09;或召回率&#xff08;Recall&#xff09;。它是評估分類模型性能的…

【Linux】探索 Linux du 命令:管理磁盤空間的利器

給我一個擁抱 給我肩膀靠靠 你真的不需要 對我那么好 思念就像毒藥 讓人受不了的煎熬 我會迷戀上癮賴在你懷抱 &#x1f3b5; 陶鈺玉《深夜地下鐵》 在 Linux 系統管理中&#xff0c;磁盤空間管理是一項基礎而重要的任務。du&#xff08;disk usage&#…

如何解決IntelliJ IDEA中pom.xml依賴項引發的安全漏洞黃線警告問題

背景 在開發過程中&#xff0c;當我們在pom.xml文件中添加依賴項時&#xff0c;經常會發現IntelliJ IDEA報出黃色警告線條&#xff0c;提示存在潛在的安全漏洞。警告的具體展現形式如下&#xff1a; 解決方案 首先&#xff0c;打開設置菜單界面&#xff0c;接著選擇編輯器選…

vue3土味情話pinia可以持久保存再次修改App樣式

我是不是你最疼愛的人-失去愛的城市 <template><div class"talk"><button click"getLoveTalk">土味情話</button><ul><li v-for"talk in talkStore.talkList" :key"talk.id">{{ talk.title }}<…

用 Supabase CLI 進行本地開發環境搭建

文章目錄 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安裝 Scoop&#xff08;1.2&#xff09;用 Scoop 安裝 Supabase CLI &#xff08;二&#xff09;本地項目環境&#xff08;2.1&#xff09;初始化項目&#xff08;2…

基于gin框架的文件上傳(逐行解析)

基于gin框架的文件上傳(逐行解析)記錄一下使用gin框架完成一個文件上傳的功能&#xff0c;一下是實現該功能的代碼&#xff0c;適合小白&#xff0c;代碼都有逐行解釋&#xff01; app.go: package routerimport ("chat/service""github.com/gin-gonic/gin&qu…

網絡工程師練習題

網絡工程師練習題 網橋怎樣知道網絡端口連接了那些網站?如果從端口收到一個數據幀,則將其源地址記入該端口的數據庫當網橋連接的局域網出現環路時怎么辦?運行生成樹協議阻塞一部分端口。使用IEEE 802.1q協議,最多可以配置4094個VLAN。VLAN中繼協議(VTP)有不同的工作模式,…

C++異常詳解

文章目錄 前言一、回顧C語言二、異常的概念三、異常的使用1.異常的拋出和捕獲2.異常的重新捕獲 三.異常安全與異常規范1.異常安全2.異常規范 四.自定義異常體系五.C標準庫的異常體系六.異常優缺點練習題總結 前言 在本篇文章中&#xff0c;我們將會詳細介紹一下有關C異常的講解…

微服務架構:注冊中心 Eureka、ZooKeeper、Consul、Nacos的選型對比詳解

微服務架構&#xff08;Microservices Architecture&#xff09;是一種基于服務拆分的分布式架構模式&#xff0c;旨在將復雜的單體應用程序拆分為一組更小、更獨立的服務單元。這些服務單元可以獨立開發、測試、部署&#xff0c;并使用不同的技術棧和編程語言。它們通過輕量級…

[華為OD] C卷 dfs 特殊加密算法 100

題目&#xff1a; 有一種特殊的加密算法&#xff0c;明文為一段數字串&#xff0c;經過密碼本查找轉換&#xff0c;生成另一段密文數字串。 規則如下 1?明文為一段數字串由0-9組成 2.密碼本為數字0-9組成的二維數組 3?需要按明文串的數字順序在密碼本里找到同樣的數字串…

PUBG非升級實用槍皮-部分盤點

藏匿處的黑貨箱武器需要耗費高額成本才能升級 對于像我這樣的日常休閑玩家來說是一筆不小的&#xff08;巨大的&#xff01;&#xff09;負擔 其實有許多普通非升級槍皮也是不錯的選擇 今天就來盤點一下我自己日常在用的普通皮 來看看你是不是也在用一樣的 &#xff08;僅是盤點…

【OceanBase診斷調優】—— 租戶資源統計項及其查詢方法

本文主要介紹 OceanBase 數據庫中租戶資源統計項及其查詢方法。 適用版本 OceanBase 數據庫 V4.1.x、V4.2.x 版本。 CPU 資源統計項 邏輯 CPU 使用率&#xff08;線程處理請求的時間占比&#xff09;。 通過虛擬表 __all_virtual_sysstat 在 SYS 系統租戶下&#xff0c;查看…

AtCoder Beginner Contest 308 A題 New Scheme

A題&#xff1a;New Scheme 標簽&#xff1a;模擬 題意&#xff1a;給定 8 8 8個數的序列&#xff0c;詢問這些數是否滿足以下條件&#xff1a; 在 100 100 100到 675 675 675之間且能被 25 25 25整除序列是單調非遞減的 題解&#xff1a;按題意模擬判斷就好了。 代碼&#…

09.zabbix自定義模塊并使用

zabbix自定義模塊并使用 根據tcp的11中狀態獲取值&#xff0c;進行批量配置監控項 [rootyunlong66 ~]# cat /etc/zabbix/zabbix_agentd.d/tcp.conf UserParameterESTABLISHED,netstat -antp |grep -c ESTABLISHED UserParameterSYN_SENT,netstat -antp |grep -c SYN_SENT Use…

Obsidian/Typora設置圖床

在obsidian中默認圖片是保存在本地的&#xff0c;但是在要導出文檔上傳到網上時&#xff0c;由于圖片保存在本地&#xff0c;會出現無法加載圖片的問題。 這里引用的一段話&#xff1a; 這里使用picgo-core和gitee實現圖床功能&#xff0c; 參考1&#xff1a; Ubuntu下PicGO配…

Github學習

1.Git與Github 區別: Git是一個分布式版本控制系統&#xff0c;簡單的說就是一個軟件&#xff0c;用于記錄一個或若干個文件內容變化&#xff0c;以便將來查閱特點版本修訂情況的軟件。 Github是一個為用戶提高Git服務的網站&#xff0c;簡單說就是一個可以放代碼的地方。Gi…