多域名环境,页面获取url的一种方案
因为系统是分布式部署的。而且有多个域名,所以常常涉及到获取url的问题。
这是系统框架层面须要提供的能力。否则每一个模块都须要自己去想办法获取ip,就会非常混乱。上线也easy发生bug
主要须要解决几个问题:
1、可以自己主动区分开发环境和生产环境。比方部署上线。url可能是http://www.xxx.com/svc/hello,而在本地开发的时候应该是http://127.0.0.1/svc/hello。而不能写死,否则开发和部署就要换来换去。非常麻烦
2、可以依据不同的服务。区分URL。比方获取验证码的服务。应该调用http://www.xxx.com/svc/getCode。而微信相关的服务,应该调用http://wx.xxx.com/svc/xxx
本文总结分享一下思路:
配置文件
1、应用有相应的配置文件,里面说明了是以开发模式,还是以生产模式启动。而且将URL分离开,比方鉴权相关的URL,微信相关的URL,普通服务相关的URL等
2、同一时候,配置文件有多份,比方topo-dev.json。topo-production.json,topo-image.json等。这样就把不同的环境隔离开,假设是以开发模式启动,载入的就是topo-dev.json,当中配置的URL都是127.0.0.1这种
3、启动的时候,载入此配置文件,并将关键信息放在global._g_env全局变量以下。执行时就能非常方便地获取到环境和URL信息了
服务端获取URL
服务端的代码也是跑在node环境下。所以要获取URL就非常easy,通过_g_env.url,就能够拿到配置文件中的路径了
前端页面获取URL
前端页面常常也须要发送ajax请求。所以也须要知道url。可是静态的js没有办法获取server的环境信息和URL等。所以须要从服务端获取到这些信息,一种可行的做法是:
首先服务端有一个服务,专门将这些信息下发:
function clientSettingScript(req, res, next){
var script = "window.global = {_g_server:{}}; \n"+
";global[\"_g_server\"].staticurl=\"" +global["_g_topo"].clientAccess.staticurl + "\"\n"+
";global[\"_g_server\"].uploadurl=\"" +global["_g_topo"].clientAccess.uploadurl + "\"\n"+
";global[\"_g_server\"].authurl=\"" +global["_g_topo"].clientAccess.authurl + "\"\n"+
";global[\"_g_server\"].serviceurl=\"" +global["_g_topo"].clientAccess.serviceurl + "\"\n"+
";global[\"_g_server\"].wxserviceurl=\"" +global["_g_topo"].clientAccess.wxserviceurl + "\"\n"+
";global[\"_g_server\"].nail_pc_url=\"" +global["_g_topo"].connector.nail_pc_url + "\"\n"+
";global[\"_g_env\"] =\"" +global["_g_topo"].env+ "\";\n";
res.end(script);
}
这是一个express的普通服务,可是事实上是一段js脚本。在前端页面,用script标签来载入它
<script src="/svc/portal/setting"></script>
这样当浏览器拿到响应之后,就会将它作为一段js脚本来运行。在window上放了一个全局变量global,当中有环境信息和URL信息
同一时候,URL仅仅包括域名,页面依据实际情况,组装完整的URL,比方:
security_code_url: global["_g_server"].serviceurl + "/getCode/"
总结
这样的做法的关键在于:
1、把URL和环境信息放到单独的配置文件里,而不是写死在代码里。同一时候依据开发环境、生产环境、镜像环境隔离不同的配置文件
2、server端专门写一个服务,把这些配置信息给到client页面,client页面也不用写死了
多域名环境,页面获取url的一种方案的更多相关文章
- 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
http://www.jb51.net/article/70415.htm 含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...
- .NET手记-JS获取Url参数
最近为App做活动专区,其中很多活动都是采用html 5页面来制作的.一方面体量较小,制作快速,更新维护容易:另一方面,嵌入App后适配效果也不会很差. 这里我们采用混编形式来从native app传 ...
- 【C++】获取URL中主机域名
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h& ...
- APPCAN开发笔记:html页面之间的参数传递:使用js获取url中的参数,以及在APPCAN中不能使用的解决方法
用PHP的GET/POST方式来传递方式已经是司空见惯了,但是如果我的页面是一个静态的html的页面,想传递参数的时候要怎么办呢?在APPCAN的开发中我们会经常遇到这样的问题,因为所有的页面都是静态 ...
- js获取url参数值,js获取其他页面传递而来的值
index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...
- c#获取页面重定向url
/// <summary> /// 获取页面重定向url /// </summary> /// <param name="url"></p ...
- 用js 获取url 参数 页面跳转 ? 后的参数
记得之前在原来的公司写过这个东西,但是还是忘记怎么接住参数了,只知道怎么把id传过去! 问了身边的大佬 他首先推荐了我一个链接是别人写好的方法 附上链接地址:http://blog.csdn.net/ ...
- JQ获取URL中是否含有某个字符的话,对页面进行某种操作
一.//JQ获取URL中是否含有某个字符的话,对页面进行某种操作 例:如果URL中含有xia的字符,就在页面引入一个cssvar str=window.location.href; //获取地址栏UR ...
- Java获取URL中的顶级域名domain的工具类
方式一: import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import jav ...
随机推荐
- Javascript数组求和的方法总结 以及由斐波那契数列得到的启发
一次面试中,面试官要求用三种不同的Javascript方法进行一个数字数组的求和,当时思来想去只想到了使用循环这一种笨方法,因此面试比较失败,在这里总结了六种Javascript进行数组求和的方法,以 ...
- 记录一次Session偶尔获取不到的解决过程
导读 平台下某子系统有密码登录需求,初步考虑用Session,登录后设置Session[key]=value;Session中若某key对应的Session,即Session[key]为null则限制 ...
- 在moba游戏里面模拟实现绝地求生毒雾圈功能
---恢复内容开始--- 已经有很长一段时间没做项目了上半年大多数时间都荒废在王者荣耀,哈哈,S8赛季也上了王者,美滋滋 转回正题,公司需要开个新项目,需要把原有的moba游戏,改成类似绝地求生那玩法 ...
- vim如何显示行号
在 vim 里执行(在普通模式下直接按冒号,并输入下面的命令 :set number 回车后就可以显示行号了,但重启 vim 后又会恢复默认的设置. 要想每次进入 vim 都显示行号就需要配置 vim ...
- Python学习一:序列基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...
- 前端面试题(6)图片格式jpg,gif,png-8,png-24的区别,及其各自的使用场景
Gif格式特点: 透明性,Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha透明). 动画,Gif这种格式支持动画. 无损耗性,Gif是一种无损耗的图像格式, ...
- 0e开头MD5值小结
s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387 ...
- [欧拉路径]Play on Words UVA10129
传送门: UVA - 10129 题目大意: 给定一些单词(可能会重复出现),判断单词是否能排成一个序列,前提是单词的最后一个字母与下一个单词的第一个字母相同.输出"The door c ...
- git学习之创建版本库
创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以 ...
- laravel中with()方法,has()方法和whereHas()方法的区别
with() with()方法是用作"渴求式加载"的,那主要意味着,laravel将会伴随着主要模型预加载出确切的的关联关系.这就对那些如果你想加在一个模型的所有关联关系非常有帮助 ...