因为系统是分布式部署的。而且有多个域名,所以常常涉及到获取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的一种方案的更多相关文章

  1. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)

    http://www.jb51.net/article/70415.htm    含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...

  2. .NET手记-JS获取Url参数

    最近为App做活动专区,其中很多活动都是采用html 5页面来制作的.一方面体量较小,制作快速,更新维护容易:另一方面,嵌入App后适配效果也不会很差. 这里我们采用混编形式来从native app传 ...

  3. 【C++】获取URL中主机域名

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <windows.h& ...

  4. APPCAN开发笔记:html页面之间的参数传递:使用js获取url中的参数,以及在APPCAN中不能使用的解决方法

    用PHP的GET/POST方式来传递方式已经是司空见惯了,但是如果我的页面是一个静态的html的页面,想传递参数的时候要怎么办呢?在APPCAN的开发中我们会经常遇到这样的问题,因为所有的页面都是静态 ...

  5. js获取url参数值,js获取其他页面传递而来的值

    index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...

  6. c#获取页面重定向url

    /// <summary> /// 获取页面重定向url /// </summary> /// <param name="url"></p ...

  7. 用js 获取url 参数 页面跳转 ? 后的参数

    记得之前在原来的公司写过这个东西,但是还是忘记怎么接住参数了,只知道怎么把id传过去! 问了身边的大佬 他首先推荐了我一个链接是别人写好的方法 附上链接地址:http://blog.csdn.net/ ...

  8. JQ获取URL中是否含有某个字符的话,对页面进行某种操作

    一.//JQ获取URL中是否含有某个字符的话,对页面进行某种操作 例:如果URL中含有xia的字符,就在页面引入一个cssvar str=window.location.href; //获取地址栏UR ...

  9. Java获取URL中的顶级域名domain的工具类

    方式一: import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import jav ...

随机推荐

  1. Kotlin实现LeetCode算法题之Two Sum

    LeetCode介绍 LeetCode是算法练习.交流等多功能网站,感兴趣的同学可以关注下(老司机请超车).页面顶部的Problems菜单对应算法题库,附带历史通过滤.难易程度等信息. 未来计划 打算 ...

  2. JDBC连接数据库的几种方法

    一. 最古老的方法(通过 Driver 接口直接连接数据库) 首先创建一个 Driver 实现类的对象 Driver dirver = new com.mysql.jdbc.Driver(); 准备连 ...

  3. sql 1.1 1.1.1 1.10.1 排序

    解决思路:计算每位的权重,得到序号完整的权重值,使用权重值进行排序! 创建sql 函数如下: ALTER FUNCTION [dbo].[SequenceToOrderNum] ( @Sequence ...

  4. C#实现倒油算法

    原题如下:12(a桶 满的 有12斤油)斤桶里 取出6斤油 有 另外有8斤(b桶)和5斤(c桶)两个空桶  让程序输出取出这6斤油的步骤 现在实现的算法可以配参数(定义有几个桶,初始有多少油,要得到多 ...

  5. enote笔记法(2)——why的使用

    章节:why的使用 用法: why 概念|词汇(比概念更一般的形式的keyword)|短语|句子 用法1: why 概念|why keyword([比概念更一般的形式的keyword]) “why 概 ...

  6. Win32API起始处的mov edi, edi与用户空间InlineHook

    在x86平台上,无论是在调试器中跟到系统DLL中时,还是反汇编某个系统DLL时,经常会发现很多API的第一条汇编指令都是mov edi, edi.根据经验来讲,C函数的汇编形式,应该是首先push e ...

  7. Java精选笔试题

    合抱之木,生于毫末:九层之台,起于垒土:千里之行:始于足下.赶快测测你的Java基础知识掌握的如何? 1,下列说法正确的是() A.一个文件里可以同时存在两个public修饰的类 B.构造函数可以被重 ...

  8. 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一

    简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页  和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...

  9. Unity3D寻路导航烘焙

    在初次进行3D(三维)游戏体验中,避免不了对游戏有生疏的情况,因此在游戏中一般会插入新手指导.自动寻路.导航地图等AI人工智能技术到游戏中,方便玩家更快体验,为了玩家的体验更好,Unity3D寻路导航 ...

  10. jsp加java连接数据库,进行信息输入,并进行初步的拦截判断。

    图形大概这样 按照图片要求设计添加新课程界面.(0.5分) 在后台数据库中建立相应的表结构存储课程信息.(0.5分) 实现新课程添加的功能. 要求判断任课教师为王建民.刘立嘉.刘丹.王辉.杨子光五位教 ...