在SAAS模式的系统中,其租户可以使用一个独立的登陆页面甚至一套首页。一般使用nginx进行反向代理设置。通过域名分发指向不同的
登录页面。分析和设置步骤如下:

整体思路

  • 期初设计是按照租户每家分配一个三级域名(业务系统自身是二级域名),在nginx监听第三级域名进行访问定向分发,进入业务系统内部则按照统一进行分发。
  • 后续查看系统实现,发现其登陆页面包括两部分,一种部分是直接访问登陆页面,另一部分是拦截请求跳转到登录页,两部分均是使用springmvc的forward的跳转。即访问一个controller路径,然后转发到登录页。
  • 基于系统实现,我们发现由于后台controller路径只能唯一,不能设置个性化路径(不是技术层面,是框架层面的问题)。因此基于域名定向分发的方案不可能实现。
  • 由于系统forward的路径是在controller中指定的,存在转发时更换页面的可能性,因此我们可以在nginx中根据三级域名设置特定参数,使用nginx加入请求参数的方式传入后台,后台在合适地方根据特定参数设置登陆页面的地址,从而实现了个性化登陆主页的需求。

nginx实现

nginx实现分为两部分,一部分是拦截三级域名,另一部分是设置域名跳转,其中
拦截三级域名的代码:

if ($host ~* ^([^\.]+)\.([^\.]+)\.([^\.]+)\.([^\.]+)$) {
      set $subdomain $1;
    }

设置域名跳转的代码:

location /{
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    set $args_type $args;
    if ( $args_type = '') {
        set $args "loginpath=../hos/${subdomain}";
    }
    if ( $args_type != '') {
        set $args "${args}&loginpath=../hos/${subdomain}";
    }
    proxy_pass http://地址;
    proxy_redirect default;
   }

后台部分

在controller中,增加对longinpath的监听,如果非空则直接跳转到其指定的页面:

String loginpath = WebUtils.getCleanParam(request, "loginpath");

if(!StringUtils.isEmpty(loginpath)) {
    return loginpath;
}
return loginPage;

后记

  1. 目前设置的登陆页面的存放位置为:hos/{三级域名与}.jsp
  2. 部分客户使用IP访问系统,方式是为其开放一个独享的端口,在内部直接set $args.不在解析相关域名
Last modification:June 4, 2019
If you think my article is useful to you, please feel free to appreciate