近几年,越来越多的网站开始支持https,我们可以看到国外的比如github、谷歌、facebook;国内的有百度、淘宝、博客园、coding.net、worktile等一系列的网站。

我再最近的开发中,涉及到了一部分。我再页面中加入广告的代码,但是业务线的同事激动的告诉我他们要全站支持HTTPS,这对于我来说既兴奋又紧张,我当然对新技术充满好奇,但是我从来没有这方面的经验,为此我仔细的调查并找运维大神们问了一圈,我简单整理了一下,说一下有关于前端这边HTTPS的应对方案。

那么什么是HTTPS、它带来了什么?

  从名字来看,它比http多了一个“s”,这个“s”表示安全。目的在于提供更安全的HTTP通道,即HTTP下加入SSL层并且加密。太详细的我就不再这里说了,再说我就要抄百度百科了。简单来说,不同于HTTP使用80端口,HTTPS使用443端口,HTTPS还需要一个付费的CA证书来保证安全。从另一个角度讲安全也带来了开销和通信效率的降低,这就要看产品的一个取舍了。

HTTP给前端页面带来哪些挑战,不改行不行?

1、HTTPS下不能调用HTTP静态资源:

  浏览器默认是不允许在HTTPS里面引用HTTP资源的,一般都会弹出提示框,用户确认后才会继续加载,用户体验非常差。而且如果在一个HTTPS页面里动态的引入HTTP资源,比如引入一个js文件,会被直接block掉的。Chrome 21之后,在SSL加密页面embed非SSL的Flash会怎样呢?会被默默的屏蔽掉,只留下一句console报告。浏览器为了安全,https下跨协议调用http的是不行的,控制台里会有警告。所以你只能去找https协议的 css、js资源了。也有文章说https页面中可引用http的图片,我试了一下,发现虽然不会报红错,但是会有黄色的提醒。最好的方法是使用https的资源。

2、HTTPS下不能调用HTTP的异步请求:

  如果在https的页面中使用http的ajax调用。会提示跨域的报错,很明显有违ip地址、端口、协议的跨域限制。有两种方案:其一试调用https的ajax,既然页面都升级到https了那么服务接口升级也是应该的。其二既然跨域了,我们可以考虑jsonp的方案,但是jsonp 发出的是js文件请求(再次强调jsonp和ajax是两回事)。所以同上一个问题https中应用静态资源也必须是https的。所以即使是jsonp的方式也要提供jsonp接口的服务器支持https。看来异步请求也要升级到https才行。

3、a标签好不好用?

  这个还是好用的,即使是https的页面也可以跳转到http的链接。

4、不改行不行:

  通过上面两个问题,不改肯定是不行的。页面的静态用不了,请求也报错,这肯定是不行的。

前端应该如何应对?

1、静态文件拉取:

  首先要保证在https的页面中拉取http的静态资源。那么静态资源就必须支持https。这方面就要去抱运维大神们的大腿了,申请证书,配置到需要使用的服务器上(我们应该事先提供会用到哪些静态资源的域名)。确保可以获取https的静态资源后。我们可以考虑下一步。

2、服务升级:

  同样的拿到证书后,要保证ajax的jsonp的接口支持https。这样服务端的工作就支持的差不多了。

3、页面引用:

  既然我们的静态文件支持了http和https两种协议。但是静态文件并不知道页面是什么协议。我们应该怎么适应呢?引用资源的url中我们应该使用相对协议,比如

src=“http://a.com/static/a.js”

应该改为如下:去掉http:

src=“//a.com/static/a.js”

以“//”开头表示相对协议,页面使用的是什么协议,文件请求也自动是什么协议。同样的异步请求也应该这样适应。

4、对于老数据应该如何应对:

  好多的url中直接就带有http:// 那是过去留下来的历史问题。这些url存在数据库中,通过同步、异步的接口来到页面上,由于https的问题我们不能直接使用,我们就要通过js改造这些http:。简单来说,就是一个正则替换

(“http://abc.com/index.html”).replace(/http:/g, "")

  但是对于异步返回的json中,我们不能遍历每一个属性去替换,因为我们事先不了解json的结构,嵌套层级数,一个一个遍历也太低效了。我这里提供一个比较方便的方法,就是现将json序列化成字符串,再全局替换后反序列化。

 var relativeHttp = function(obj){
var strObj = JSON.stringify(obj);
var removeHttp = strObj.replace(/http:/g, "");
return JSON.parse(removeHttp);
}

5、a标签跳转

  因为https的页面中可以跳转到http的页面。这里有两个选择是写绝对协议还是相对协议,因为如果使用相对协议,跳转的时候会带上页面的协议,我们不能保证目标地址是否支持本页面的协议,所以,建议你使用绝对协议写到页面中

<a href="http://abc.cn/product/1290.html" target="_blank"></a>

而不是:

<a href="//abc.cn/product/1290.html" target="_blank"></a>

6、相对协议,永远都好用吗?

  相对协议在放进标签、js异步请求是都好用。但是当url的参数中需要加入url时,就不是很好用了。我们的“//”并没有成功,我们需要根据页面的情况加入协议,拼装成完整的url,我们怎么获取协议呢?其实浏览器为我们提供了这种API  window.location.protocol  如下图:

  我们拿到协议后可以根据需要来使用它。

  

前端静态文件如何应对HTTPS的到来的更多相关文章

  1. 如何用Tomcat部署前端静态文件

    在项目开发的过程中,一些公司经常是前后台分开的,并不是所有的前端文件都在后台项目中,尤其是互联网公司.这时候就需要后端人员单独运行前端文件.怎么用Tomcat部署运行前端静态文件呢? 工具/原料   ...

  2. Asp-Net-Core开发笔记:使用NPM和gulp管理前端静态文件

    前言 本文介绍的是AspNetCore的MVC项目,WebApi+独立前端这种前后端分离的项目就不需要多此一举了~默认前端小伙伴是懂得使用前端工具链的. 为啥要用MVC这种服务端渲染技术呢? 简单项目 ...

  3. 【Python-Django后端开发】配置静态文件详解!!!

    配置前端静态文件 1. 准备静态文件 2. 指定静态文件加载路径 STATIC_URL = '/static/' # 配置静态文件加载路径 STATICFILES_DIRS = [os.path.jo ...

  4. Django(十七):静态文件、中间件

    一.静态文件 参考:https://www.cnblogs.com/jiajiaba/p/10584329.html 参考:https://docs.djangoproject.com/zh-hans ...

  5. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  6. Web前端性能优化——如何有效提升静态文件的加载速度

    WeTest 导读 此文总结了笔者在Web静态资源方面的一些优化经验. 一.如何优化 用户在访问网页时, 最直观的感受就是页面内容出来的速度,我们要做的优化工作, 也主要是为了这个目标.那么为了提高页 ...

  7. web前端性能优化,提升静态文件的加载速度

    原文地址:传送门 WeTest 导读 此文总结了笔者在Web静态资源方面的一些优化经验. 如何优化 用户在访问网页时, 最直观的感受就是页面内容出来的速度,我们要做的优化工作, 也主要是为了这个目标. ...

  8. 比较好的前端方法库及一些vue如何引入静态文件

    https://select2.github.io/examples.html   select2 自动搜索带select选择 ## 表单提交 https://github.com/marioizqu ...

  9. 百度分享不支持https的解决方案(单独部署静态文件)

    首先是参考了博客,下载百度分享的静态代码 static 链接为:https://www.cnblogs.com/mmzuo-798/p/6434576.html 后来在nginx的 nginx.con ...

随机推荐

  1. pat04-树4. Root of AVL Tree (25)

    04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...

  2. linux下Oracle 相关命令

    #注意:例子中的oralce命令在/home/oracle/oracle/product/10.2.0/db_1/bin目录.#你可以自己修改成自己的目录. A.#dbstart //启动数据库 #d ...

  3. js中判断对象是否存在

    s中判断对象是否存在,写法有很多种: 第一种:if (!myObj) { var myObj = { }; }第二种:var global = this;  if (!global.myObj) {  ...

  4. 实用的随机数生成类Random:测试(随机产生100个不重复的正整数)

    实用的随机数生成类Random:测试(使用Random类随机生成100个不重复的正整数) 一.之前我们使用随机数用的是Math类的random()方法: tips: 产生随机数(0~9中任意整数)的方 ...

  5. MySQL出现时区错误的解决方法

    目录 环境 问题 分析 解决方法 环境 windows10 MySQL 8.0.13 IDEA 问题 The server time zone value 'Öйú±ê׼ʱ¼ä' is unre ...

  6. initBinder转换日期格式

    @Controller public class FirstController { @RequestMapping("/first") //类型转化工作一定是在真正的handle ...

  7. spark编程python实例

    spark编程python实例 ValueError: Cannot run multiple SparkContexts at once; existing SparkContext(app=PyS ...

  8. CocoaPods管理的项目移植到别人电脑后找不到头文件

    CocoaPods管理的项目移植到别人电脑后找不到头文件 在TARGETS -> Search Paths -> User Header Search Paths 中 写入 ${SRCRO ...

  9. 在Eclipse安装Genymotion插件的经验心得

    个人心得分享,不当之处还请指正. Eclipse自带的Android模拟器已经无力吐槽了,新手刚上手时或许配置完环境已经精疲力尽了,或许还沉浸在开发成功的喜悦当中,对AVD模拟器的运行情况关注不大,渐 ...

  10. 【起航计划 031】2015 起航计划 Android APIDemo的魔鬼步伐 30 App->Preferences->Advanced preferences 自定义preference OnPreferenceChangeListener

    前篇文章Android ApiDemo示例解析(31):App->Preferences->Launching preferences 中用到了Advanced preferences 中 ...