You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QWebView显示‘Network Access is disabled’及Qt网络错误99求助

QWebView无法加载Okta SAML URL的排查方案

运行环境

  • Ubuntu 22.04
  • Qt 5.12.8
  • OpenSSL 1.1.1f

问题描述

QWebView加载特定Okta SAML URL时失败,该URL在Firefox浏览器中能正常访问,但QWebView返回如下错误日志:

Failed URL: "https://dev-81029421.okta.com/app/dev-81029421_442710740samlidp_1/exkanm3x81DrxatKc5d7/sso/saml"

NetworkError: QNetworkReply::UnknownNetworkError
http status = 0
httpStatusMsg = ""

(截图时间:2024年1月17日上午9:28:49)

我的QWebView配置代码如下,反复检查后未发现明显问题,求后续排查方向:

QWebView * m_samlView = new QWebView();

// Set User Agent
QString browserUserAgent = m_samlView->page()->mainFrame()->evaluateJavaScript("navigator.userAgent").toString();
m_pUserAgentPage = new UserAgentWebPage();
m_pUserAgentPage->setBrowserUserAgent(browserUserAgent);
m_samlView->setPage(m_pUserAgentPage);

// Network Access Manager
m_pNetworkAccessManager = new QNetworkAccessManager();
m_pNetworkAccessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);
m_samlView->page()->setNetworkAccessManager(m_pNetworkAccessManager);

// Network Proxy
checkProxy(); 
QNetworkProxy::setApplicationProxy(m_networkProxy);
m_samlView->page()->networkAccessManager()->setProxy(m_networkProxy);

// Enable Javascript
m_samlView->page()->settings()->setAttribute(QWebSettings::JavascriptEnabled, true);

 // Enable web inspector
m_samlView->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);

QWebInspector inspector;
inspector.setPage(m_samlView->page());
inspector.setVisible(true);

// Setup Network Cookie Jar
m_pCookieJar = new CookieJar();
m_samlView->page()->networkAccessManager()->setCookieJar(m_pCookieJar);

// Clear cache and cookies
clearCacheAndCookies();

// QWebView: Connect signals/slots
connect(m_samlView, SIGNAL(urlChanged(const QUrl&)),
        this,       SLOT(onUrlChanged(const QUrl&)));
connect(m_samlView, SIGNAL(loadFinished(bool)),
        this,       SLOT(onLoadFinished(bool)));

// QNetworkAccessManager: Connect signals/slots
connect(m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)),
        this,                    SLOT(onFinished(QNetworkReply*)));
connect(m_pNetworkAccessManager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)),
        this,                    SLOT(onSslErrors(QNetworkReply*, const QList<QSslError>&)));

排查方向

1. 检查SSL/TLS协议兼容性

Qt 5.12.8默认SSL配置可能不支持Okta要求的TLS版本(比如TLS 1.3),手动指定兼容的协议测试:

QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
sslConfig.setProtocol(QSsl::TlsV1_2OrLater);
m_pNetworkAccessManager->setSslConfiguration(sslConfig);

同时确认OpenSSL 1.1.1f是否启用了对应协议支持,Qt编译时是否关联了正确的OpenSSL库。

2. 捕获更详细的错误信息

在onSslErrors槽中打印所有SSL错误细节,排查证书验证问题:

void onSslErrors(QNetworkReply* reply, const QList<QSslError>& errors) {
    qDebug() << "SSL错误详情:";
    for (const QSslError& err : errors) {
        qDebug() << err.errorString();
    }
    // 临时忽略SSL错误测试(仅用于排查,生产环境别这么做)
    reply->ignoreSslErrors();
}

另外在onFinished槽中调用reply->errorString(),可能拿到比UnknownNetworkError更具体的错误描述。

3. 替换User-Agent为Firefox的字符串

代码中获取的默认User-Agent和Firefox差异大,直接用Firefox的UA测试:

QString firefoxUA = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0";
m_pUserAgentPage->setBrowserUserAgent(firefoxUA);

4. 测试默认CookieJar

自定义CookieJar可能存在处理问题,临时替换为默认实现:

m_samlView->page()->networkAccessManager()->setCookieJar(new QNetworkCookieJar());

5. 排查代理配置冲突

同时设置了全局代理和NetworkAccessManager的代理,可能有冲突。尝试只保留一种配置,或者检查代理是否需要认证,代码中是否处理了代理认证逻辑。

6. 考虑WebKit版本限制

Qt 5.12.8的QWebView基于旧版WebKit,可能不支持现代网页的某些JS特性或安全机制。如果项目允许,可尝试替换为Qt WebEngine;或者查找对应Qt版本的WebKit补丁。

内容的提问来源于stack exchange,提问作者anshah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:35:56