作为一个前端开发者,我们经常需要和各种各样的接口打交道,很多时候我们的开发环境的域和接口所在的域是不同的,比如我们本地开发环境运行域是localhost,但接口所在的域是www.xx.com,这个时候如果我们代码中出现异步请求www.xx.com域API的情况,就会出现跨域问题。

一般情况下,我们会请后端大佬帮我们加上跨域策略,通过设置响应头Access-Control-Allow-Origin来解决跨域问题,但是有时候我们最终的代码可能也会发布到和API的同域的环境上去,如果每个接口都需要请后端加上跨域策略也不太现实,还可能附带产生一些安全隐患,这个时候我们就可以祭出神器浏览器插件了,我们在介绍插件基础知识的时候有提到插件可以拦截请求并更改其中的一些参数,其实要解决跨域问题,我们只需要在请求得到响应之前,修改响应头,添加Access-Control-Allow-Origin头信息,就可以实现跨域访问了。

我们继续看如何编写这个插件,在开始之前我们还是给我们的插件取一下比较优雅的名字“跨域调试助手”,由于插件需要修改响应头,所以我们需要在manifest.json文件中申请webRequest, webRequestBlocking这两个权限,另外content_scripts定义的是注入到页面的资源,如果我们需要拦截请求,就需要在背景页中完成,下面我们看一下插件的具体实现。

首先插件的目录结构:

manifest.json文件的代码如下:

 {
"name" : "跨域访问助手",
"version" : "1.0",
"description" : "允许跨域访问",
"manifest_version" : 2,
"icons": {
"16": "images/ico-48.png",
"48": "images/ico-48.png",
"128": "images/ico-48.png"
},
"browser_action": {
"default_title": "跨域访问助手"
},
"permissions" : ["webRequestBlocking", "webRequest", "*://*/*"],
"background" : {
"scripts" : ["js/background.js"]
}
}

background.js文件的代码如下:

 var modifyFieldName = 'Access-Control-Allow-Origin';

 chrome.webRequest.onHeadersReceived.addListener(function(details) {
var responseHeaders = details.responseHeaders;
var allowOriginHeader = responseHeaders.find(function(rh, index){
if (rh.name === modifyFieldName) {
responseHeaders[index]['value'] = '*';
return true;
}
});
if (!allowOriginHeader) {
responseHeaders.push({
name: modifyFieldName,
value: '*'
});
}
return {
responseHeaders: responseHeaders
};
},
{
urls : ["<all_urls>"]
},
["responseHeaders", "blocking"]);

其中对于chrome.webRequest模块,如果有不清楚的可以点击这里查阅。

好了,一个简单却实用的跨域插件就完成了,自从有了这跨域插件妈妈再也不用担心我跨域调试了!!!

Chrome插件开发(二)的更多相关文章

  1. Chrome插件开发入门(二)——消息传递机制

    Chrome插件开发入门(二)——消息传递机制   由于插件的js运行环境有区别,所以消息传递机制是一个重要内容.阅读了很多博文,大家已经说得很清楚了,直接转一篇@姬小光 的博文,总结的挺好.后面附一 ...

  2. Chrome插件开发,美化网页上的文件列表。chrome-extension,background

    上一篇文章 通过“content-scripts”的方式向页面注入js和css来美化页面,但是有一个弊端:一旦配置好需要注入的页面,之后如果这个页面地址以后发生变化,或者要新加一些URL进来,那么得修 ...

  3. Chrome插件开发,美化网页上的文件列表。chrome-extension,content-scripts

    趁着2018年还剩最后几天,发几篇博客,荒废太久了,惭愧. 最近也是需求驱动,研究了下Chrome插件开发.来看一下我们公司运维提供的日志查看页面 所有项目的日志都参杂在一起,每次去找都很痛苦.慢慢发 ...

  4. chrome插件开发-消息机制中的bug与解决方案

    序言 最近开发chrome插件,涉及到消息传递机时按照教程去敲代码,结果总是不对.研究了大半天终于找到原因,现在记录下. 程序 插件程序参考官网 chrome官网之消息传递机制, 不能FQ的同事也可以 ...

  5. vue.js 初体验— Chrome 插件开发实录

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:陈纬杰 背景 对于经常和动画开发打交道的开发者对于Animate.css这个动画库不会陌生,它把一些常见 ...

  6. 手把手教你开发Chrome扩展二:为html添加行为

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...

  7. [Chrome插件开发]001.入门

    Chrome插件开发入门 Chrome扩展文件 Browser Actions(扩展图标) Page Actions(地址栏图标) popup弹出窗口 Background Pages后台页面 实战讲 ...

  8. chrome插件开发学习(一)

    两个不错的网址: 360chrome插件开发文档:http://open.chrome.360.cn/extension_dev/manifest.html 图灵 chrome插件开发于应用 电子书: ...

  9. chrome插件开发-----------将网址转化成二维码website2QRcode

    微信自带的浏览器无法输入链接,仅仅能通过扫描二维码实现.可是有时候看到一个有趣的站点,想分享,还得先去将链接转化成二维码的站点.先转成二维码.再扫描.有点麻烦.所以写了一个插件.直接生成二维码. 须要 ...

随机推荐

  1. pip换源

    PIP 下载慢,给你Python3的pip换个源 一键换源 文章来源:企鹅号 - 从零开始学习python 要实现一键换源需要安装一个模块 pip install pqi PQI相关命令 PQI获取当 ...

  2. 自适应布局display:-webkit-box的用法

    在web布局中,我们经常使用的是display:inline-block,display:flex,这些,但其实在进行移动端设备自适应布局中,-webkit-box布局更加合适 不同的浏览器有不同的前 ...

  3. Java面向对象程序设计第6章1-12

    1.this和super各有几种用法? this this 用法有三种,主要应用场合: 表示当前对象引用,常用于形参或局部变量与类的成员变 量同名的情形,使用this.成员名表示当前对象的成员 表示当 ...

  4. SpringBoot2+Netty打造通俗简版RPC通信框架

    2019-07-19:完成基本RPC通信! 2019-07-22:优化此框架,实现单一长连接! 2019-07-24:继续优化此框架:1.增加服务提供注解(带版本号),然后利用Spring框架的在启动 ...

  5. 【Java】 生成32位随机字符编号

    /** * 生成32位编码 * @return string */ public static String getUUID(){ String uuid = UUID.randomUUID().to ...

  6. jQuery插件编写学习中遇见的问题--attr prop

    个人博客: https://chenjiahao.xyz 最近在学习jQuery的插件的编写,有两种方式,$.fn.extend以及$.extend,一种是作用于对象原型上,一种是直接作用于jQuer ...

  7. Spring Cloud Feign 总结问题,注意点,性能调优,切换okhttp3

    ### Feign常见问题总结 **FeignClient接口如使用`@PathVariable` ,必须指定value属性** ```java //在一些早期版本中, @PathVariable(& ...

  8. Java 语言的发展史

    维基百科引入 早期的Java 语言最开始只是Sun计算机(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目.Sun计算机公司的一个叫做帕特里克·诺顿的工程师被公司自己开发 ...

  9. Java的IO操作之关闭流

    我们知道,当结束对一个流的操作时,需要调用流的close()方法对其进行释放,这将释放掉与这个流有关的所有资源,包括文件句柄.端口等.如果不关闭流,垃圾回收机制将无法识别你是否已使用完这个文件,读取的 ...

  10. mysql启动错误1067进程意外终止的解决方法

    一.环境介绍 1.mysql主从复制中的从服务器 2.Windows Server 2008 R2 Enterprise系统 64位操作系统 3.MySQL数据库版本为5.6.34 二.报错详情 从服 ...