实施白色标签

有时(根据我的经验,很多时候)您需要为应用程序添加白色标签。 您通常可以以SaaS方式运行它,但是一些重要的或高知名度的客户端可能想要专用的部署或本地部署,或者只是在云部署中“自己的一角”。

白色标签通常包括不同CSS,不同的徽标和其他图像以及不同的页眉和页脚文本。 其余产品保持不变。 那么,我们如何以最小的侵入性方式支持白标? (我将在示例中使用Spring MVC,但是将逻辑移植到其他框架非常简单)

首先,让我们概述支持白标的三种不同方式。 您可以(可能应该)实现所有这些功能,因为它们在不同的场景中很有用,并且有很多重叠之处。

  • 标有白色的安装–更改整个部署的样式。 对于本地安装或托管安装很有用。
  • 白标子域–允许通过特定子域访问不同样式的服务
  • 标有白色的客户–登录后允许特定客户查看自定义样式

要实现全白标安装 ,我们必须在文件系统上配置放置定制css文件和图像以及定制文本的路径。 这是启动时传递给应用程序的.properties文件的示例:

styling.dir=/var/config/whitelabel
styling.footer=©2018 Your Company
styling.logo=/images/logsentinel-logo.png
styling.css=/css/custom.css
styling.title=Your Company

在Spring/Spring启动中,如果某个URL模式匹配,则可以从文件系统中服务器文件。 例如:

@Component
@Configuration
public class WebMvcCustomization implements WebMvcConfigurer {@Value("${styling.dir}")private String whiteLabelDir;@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/whitelabel/**").addResourceLocations(whiteLabelDir);}
}

最后,您需要自定义HTML模板,但是当所有其他选项也都实现时,我们将在最后讨论。

接下来是白标子域 。 对我来说,这是最好的选择,因为它允许您一次安装多个具有特定样式的客户。 样式仅取决于访问服务所通过的域/子域。

为此,我们需要引入一个实体WhitelabelStyling和一个相应的数据库表。 我们可以创建一些管理界面来进行配置,或者直接在数据库中进行配置。 该实体可能看起来像这样:

@Table("whitelabel_styling")
public class WhitelabelStyling {@PrimaryKeyprivate String key;@Columnprivate String title;@Columnprivate String css;@Column@CassandraType(type = DataType.Name.BLOB)private byte[] logo;@Columnprivate String footer;@Columnprivate String domain;// getters and setters
}

密钥是您选择的任意字符串。 它可能与(sub)域或其他一些有意义的字符串相同。 其余大部分是显而易见的。 有了这些之后,我们需要能够提供资源。 为此,我们需要一个控制器,您可以在这里看到 。 控制器选择一个白色标签的密钥,并尝试从数据库中加载相应的条目,然后提供结果。 在这种情况下,控制器端点为/whitelabel-resources/logo.png/whitelabel-resources/style.css

为了为特定的子域设置适当的密钥,您需要每个请求的模型属性(即,在要呈现的所有页面的模型中设置的值)。 这样的事情(每天刷新一次白标签缓存;如果您不想在每个请求中都访问数据库,则必须使用缓存):

@ModelAttribute("domainWhitelabel")
public WhitelabelStyling perDomainStyling(HttpServletRequest request) {String serverName = request.getServerName();if (perDomainStylings.containsKey(serverName)) {return perDomainStylings.get(serverName);}return null;
}@Scheduled(fixedRate = DateTimeConstants.MILLIS_PER_DAY)
public void refreshAllowedWhitelabelDomains() {perDomainStylings = whitelabelService.getWhitelabelStyles().stream().collect(Collectors.toMap(WhitelabelStyling::getDomain, Function.identity()));
}

最后,使用相同的控制器,以与上述相同的方式为每个客户添加白标签 ,不是基于request.getServerName()而是基于当前已认证用户的属性来获取当前密钥。 管理员(通过UI或直接在数据库中)可以为每个用户分配一个whitelabel密钥,然后在登录后,该用户将看到自定义样式。

我们已经看到了解决方案的Java部分的外观,但是我们需要修改HTML模板以选择自定义项。 一种简单的方法如下所示(使用卵石模板):

{% if domainWhitelabel != null %}<link href="/whitelabel-resources/style.css?key={{ domainWhitelabel.key }}" rel="stylesheet">
{% elseif user.whitelabelStyling != null and user.whitelabelStyling.css != '' %}<link href="/whitelabel-resources/style.css" rel="stylesheet">
{% elseif beans.environment.getProperty('styling.dir') != '' and beans.environment.getProperty('styling.css.enabled') == true %}<link href="{{'/whitelabel/'+  beans.environment.getProperty('styling.css')}}" rel="stylesheet">
{% else %}<link href="{{ beans.environment.getProperty('styling.css')}}" rel="stylesheet">
{% endif %}

这非常简单–如果配置了域级别的白色标签,则使用该标签; 如果不是,请检查当前用户是否分配了特定的白标签; 如果没有,请检查是否配置了全局安装白色标签; 如果不是,请使用默认值。 此代码段利用了上面的WhitelabelController (在前两种情况下)和倒数WhitelabelController情况下使用了自定义资源处理程序。

总体而言,这是一个灵活,简单的解决方案,即使在现有系统上也不需要花费几天的时间即可实施和测试。 我将再次表达我对基于域的样式的偏爱,因为它们允许使用多个不同样式和徽标使用相同的多租户安装。 当然,应该正确配置Web服务器/负载均衡器/域,以允许子域并让您轻松管理它们,但这是不合时宜的。

我认为白色标签是许多产品的好方法。 显然,除非业务需要它,否则不要实施它,但要记住,它可能会落伍,并且相对容易实施。

翻译自: https://www.javacodegeeks.com/2018/07/implementing-white-labelling.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卫星链路

卫星通信系统中&#xff0c;信息传输中&#xff0c;一条传输链路包括发端地球站、上行链路、卫星转发器、下行链路、收端地球站。按照空间分布可以分为星地链路和星间链路。影响其通信性能的因素主要有&#xff1a;发射端的发射功率与天线增益、传输过程中的损耗、传输过程中所…

国家开放大学人文英语4

客观题 交际用语&#xff08;共5题&#xff0c;共10分&#xff09; 1. — Do you think cosmetic surgery is more popular with women? — ________________ . A Yes, women are more popular than men B Yes, absolutely. Because women pay more attention to beauty…

微型计算机主机的主要组成部件是,微型计算机主机的主要组成部分有

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。微型计算机的主机由CPU和内存储器组成&#xff0c; CPU相当于微型计算机的大脑&#xff0c;包括控制器和运算器&#xff0c;内存储器分为RAM和ROM。分别对应微型计算机的运行空间和存…

定义Definition、公理、定理、推论、命题和引理的区别

WHAT IS THE DIFFERENCE BETWEEN A THEOREM(定理), LEMMA&#xff08;引理&#xff09;,AND A COROLLARY&#xff08;推论&#xff09;? PROF. DAVE RICHESON (1) Definition&#xff08;定义&#xff09; 对某个数学概念\术语&#xff08;符号、表达&#xff09;的解释。 A…

[渝粤题库]陕西师范大学《金融机构管理》作业

《金融机构管理》作业 一 、选择题 1&#xff0e;在我国的金融机构中&#xff0c;下列哪一项是政策性银行&#xff1f;&#xff08; &#xff09; A.交通银行 B.中国银行 C.中国农业发展银行 D.中国农业银行 2&#xff0e;商业银行最主要的资金来源是&…

计算机网络组成包括哪些内容,计算机网络系统的组成

互联网时代已经到来了&#xff0c;小编为你科普一下网络相关基础知识《计算机网络系统的组成》&#xff0c;让你更快融入互联网时代。计算机网络系统是通信子网和资源子网组成的。而网络软件系统和网络硬件系统是网络系统赖以存在的基础。在网络系统中&#xff0c;硬件对网络的…

正定和半正定

在众多的机器学习模型中&#xff0c;线性代数的身影无处不在&#xff0c;当然&#xff0c;我们也会时常碰到线性代数中的正定矩阵和半正定矩阵。例如&#xff0c;多元正态分布的协方差矩阵要求是半正定的。 ------------------------------------------ 1. 基本的定义 正定和…

[渝粤题库]陕西师范大学《幼儿园社会教育》作业

《幼儿园社会教育》作业 一、单选题 1.谁创立了发生认识论并提出了儿童认知发展阶段论&#xff08;&#xff09; &#xff21;&#xff0e;班杜拉  &#xff22;&#xff0e;弗洛伊德 &#xff23;&#xff0e;皮亚杰&#xff24;&#xff0e;柯尔伯格 2.下列不属于…

Java 8 map(),flatMap()示例

使用map&#xff08;&#xff09;方法 编程时&#xff0c;很常见的是处理数据以便从对象集合中收集一些信息。 假设我们要从特定公司的所有员工中查找城市。 我们的员工班级如下。 public class Employee {private String name;private Integer age;private String city;priv…

[渝粤题库]陕西师范大学《幼儿园科学教育》作业

《幼儿园科学教育》作业 一、填空题 1&#xff0e;科学教育中常采用的观察方法是 ① 、 ② 、 ③ 。 2&#xff0e;幼儿劳动的种类包括 ① 、 ② 、 ③ 、 ④ 。 3&#xff0e;在幼儿科学教育中&#xff0c;情感的目标非常广泛…

HTML中button怎么填充GIF,css3给按钮添加背景渐变动画

css3给按钮添加背景渐变动画button {color:#FFF;font-size:16px;outline:none;width:300px;height:48px;background:#26A1D9;border:none;-webkit-border-radius:5px;border-radius:5px;}button:active{outline:none;background:#208FC1;/*执行动画*/-webkit-animation:showBtn…

[渝粤题库]陕西师范大学《幼儿园语言教育》作业

《幼儿园语言教育》作业 一、填空题 1、儿童语言的发展是指儿童对母语的理解和 能力随着时间的推移而发生变化的过程和现象。 2、儿童获得语言之前&#xff0c;用语音及伴随的表情或动作代替语言进行交往的现象被称为 。 3、 是指交际双方根据交际目…

[渝粤题库]陕西师范大学《商业银行经营学》作业

《商业银行经营学》作业 一 、名词解释 1&#xff0e;商业银行外部组织形式 2&#xff0e;单一银行制 3&#xff0e;银行控股公司制 4&#xff0e;合业经营 5&#xff0e;自有资本 6&#xff0e;可转让定期存单(CD) 7&#xff0e;自动转账服务账户(ATS) 8&#xff0e;回…

导数,微分,偏导,全微分,方向导数,梯度

多元函数与一元函数有一个很大的区别在于定义域的不同&#xff1a;一元函数自变量就在x轴上&#xff0c;因此趋近的方向只有某点的左右两侧&#xff0c;因此&#xff0c;考察一元函数极限的时候&#xff0c;仅考虑左邻域和右邻域即可。但是多变量微分变得复杂&#xff0c;趋向方…

html5贝塞尔,使用HTML5画布绘制贝塞尔曲线

是的&#xff0c;请使用HTML canvasbezierCurveTo()方法在HTML5中绘制Bezier曲线。示例您可以尝试运行以下代码以使用画布绘制贝塞尔曲线&#xff1a;HTML>#test {width: 100px;height:100px;margin: 0px auto;}function drawShape(){//使用DOM获取canvas元素var canvas do…

[渝粤题库]陕西师范大学《幼儿园课程》(专科)作业

《幼儿园课程》&#xff08;专科&#xff09;作业 一、单选题 1、活动课程是以&#xff08; &#xff09;为中心来组织学习内容的。 A 学科 B 问题 C 概念 D 儿童 2、&#xff08; &#xff09;指的…

perl大骆驼和小骆驼_骆驼路线的主/从故障转移

perl大骆驼和小骆驼一种实现主/从故障转移模式的方法是拥有一个应用程序的实例集群&#xff0c;其中一个实例&#xff08;主实例&#xff09;当前处于活动状态&#xff0c;而其他实例&#xff08;从属实例&#xff09;处于待机状态&#xff0c;随时可以在主实例发生故障时接管该…

牛顿法, Jacobian矩阵 和 Hessian矩阵

牛顿法 主要有两方面的应用&#xff1a; 求方程的根&#xff1b;求解最优化方法&#xff1b; 为什么要用牛顿法求方程的根&#xff1f; 问题很多&#xff0c;牛顿法 是什么&#xff1f;目前还没有讲清楚&#xff0c;没关系&#xff0c;先直观理解为 牛顿法是一种迭代求解方法…

[渝粤题库]陕西师范大学《幼儿保健学》作业

《幼儿保健学》作业 单选题 1、人一生总共&#xff08; &#xff09;块腕骨。 A 6 B 7 C 8 D 9 2、营养学中常用的能量单位是&#xff08; &#xff09;。 A 千卡 B 焦耳 C 瓦特 …

微型计算机组装实验报告虚拟,计算机硬件的组装实验报告.doc

计算机硬件的组装实验报告.doc计 算 机 硬 件 的 组 装 实验时间3月30日晚600-900 学号 姓名 一、实验目的1.加深对理论知识的理解&#xff0c;提高实际动手能力&#xff1b;2.了解计算机的主要部件&#xff0c;理解各部件的功能&#xff0c;了解微型机的各项技术指标和参数。3…