Chrome插件请求数据时 请求报错(blocked:mixed-content)

本文详细解析了Chrome插件在HTTPS环境下发送HTTP请求导致的mixed-content错误,提供了两种解决方案:一是服务器配置HTTPS,二是利用background.js处理HTTP请求,适用于不同场景。

Chrome插件请求数据时请求报错(blocked:mixed-content)

问题原因

问题原因是我在csdn上搜索到的,主要原因为https页面去发送http请求报错(浏览器阻止https发送http请求)

解决方案

方案1:配置https

将请求的服务器添加openssl扩展,使服务器支持https。该方法局限于服务器为自己的服务器,可以进行配置的情况下。

方案1:使用background.js请求http

1、如果你请求数据的代码位于content_scripts中,可以直接通过chrome.runtime.sendMessage来和background.js进行通信,把请求任务交给background.js即可解决。

2、如果你请求数据的代码是注入到网站中的inject_scripts,我们要先让inject_scripts和content_scripts进行通信,把网址和参数传给content_scripts,然后content_scripts再通过上面的方法把参数传给backgroud.js从而达到目的。
代码如下:
在这里插入图片描述

//background.js
function getPostResult(url,params,sendResponse){
   $.post(url, params, function (result) {
	           sendResponse(result);
        });
}

// 监听来自content-script的消息
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse)
{
    getPostResult(request.url,request.params,sendResponse);
	return true;//注意此处,异步的话返回值必须为true
});

//content_scripts
window.addEventListener("message", function(e)
{
	if(e.data.type=="req_bg")
	{
	//向background发送数据
	chrome.runtime.sendMessage({"url":e.data.url,"params":e.data.params}, function(response) {
	//发送给inject
	window.postMessage({"type":'bg_res',"response":response}, '*') ;

});
	}
}, false);
//inject.js
//发送请求参数给content_scripts
window.postMessage({"type":"req_bg","url":url,"params":params}, '*');//type:req_bg 请求background.js     bg_res background.js返回值
//接收background.js请求的数据
window.addEventListener("message", function (e) {
    if (e.data.type == "bg_res") //如果是来自background的返回值
    {
        var result = e.data.response;
        //接下来处理返回结果result
    }
}, false);

以上就是我的总结,希望对同样错误的同学有帮助,有疑问可以给我留言。
觉得有帮助的同学有能力可以打赏一点C币

`Blocked:Mixed-Content` 错误是浏览器在加载页面为了保障安全而触发的一种保护机制。其核心原因是当页面通过 HTTPS 协议加载,其中某些资源(如脚本、图片、样式文件或 API 请求)尝试通过 HTTP 协议加载,这会破坏页面的安全性,导致潜在的安全漏洞[^1]。 HTTPS 是加密协议,能够保障数据在传输过程中的完整性和机密性,而 HTTP 是明文传输协议,容易受到中间人攻击(MITM)。浏览器为了确保整个页面的通信安全,会对混合内容进行拦截,阻止不安全的 HTTP 请求完成[^3]。 ### 常见原因 - 页面本身是通过 HTTPS 加载,但其中的某个资源(例如图片、CSS、JavaScript 或 API 请求)使用了 HTTP 协议。 - 开发过程中可能未注意资源的协议类型,例如后端接口地址硬编码为 `http://example.com/api`,而不是使用相对路径或动态配置 HTTPS 地址。 - 第三方资源未提供 HTTPS 版本[^2]。 ### 解决方法 1. **将所有资源请求改为 HTTPS** 确保所有资源(包括 API 请求、图片、脚本和样式文件)都通过 HTTPS 协议加载。例如,将 `http://api.example.com/data` 改为 `https://api.example.com/data`[^2]。 2. **使用相对协议(Protocol-relative URLs)** 可以使用 `//example.com/resource.js` 这样的地址格式,这样浏览器会根据当前页面使用的协议(HTTP 或 HTTPS)自动选择相同的协议加载资源。 3. **检查第三方资源** 如果页面中引入了第三方资源(如广告、统计代码等),确保这些资源也支持 HTTPS。如果第三方不提供 HTTPS 版本,则需要寻找替代方案。 4. **使用内容安全策略(CSP)** 在 HTTP 响应头中添加 `Content-Security-Policy`,明确指定哪些资源可以安全加载,防止加载不安全的内容。 5. **开发环境配置 HTTPS** 在本地开发环境中也启用 HTTPS,例如使用自签名证书或工具如 `mkcert` 创建本地可信证书,以避免开发阶段引入 HTTP 资源。 6. **检查后端配置** 如果前端请求的后端接口地址配置为 HTTP,需要修改为 HTTPS。同,确保后端服务正确配置了 SSL 证书,并且可以通过 HTTPS 访问。 ### 示例:修改请求地址为 HTTPS ```javascript // 错误示例:使用 HTTP 请求 fetch('http://api.example.com/data'); // 正确示例:使用 HTTPS 请求 fetch('https://api.example.com/data'); ``` ### 示例:使用相对协议 ```html <!-- 使用相对协议加载脚本 --> <script src="//example.com/script.js"></script> ``` ### 示例:配置 Content-Security-Policy 头 ```http Content-Security-Policy: default-src https:; ``` 通过上述方法可以有效解决 `Blocked:Mixed-Content` 错误,确保页面资源加载的安全性与完整性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值