cas的主题配置与管理
一、简介
cas可以实现动态多主题的管理,同一个cas访问不同的应用的时候可以做到千人千面
,即根据访问服务的不同,如数据中心、开放平台,可以在一个服务端上实现不同的登录样式。
提问
-
什么时候去新建basename?
-
什么时候去新建theme?
当页面变化很大,不能通过配置新的css、js来实现新的主题时,可以考虑新建一套视图,如采用新的前端技术架构。这时需要新配置一个basename,否则新建theme即可。
二、主题的配置
cas配置核心文件为:cas.properties
。
所有的配置都和下面2个配置息息相关:
-
cas.themeResolver.defaultThemeName
配置的是默认主题; -
cas.viewResolver.basename
是静态页面所在文件夹,且只能设置一个,如果页面结构、样式不去大改,我们定义一个新主题就可以啦。
目前我们的cas中共有3个主题样式:
ThemeName | basename | 页面映射配置 |
---|---|---|
cas-theme-default | custom_views | custom_views.properties |
cas-theme-deepBlue | ||
cas-theme-orange | ||
themeName与basename之间的关系
- 引用配置
ThemeName的名称会对应到一个同名的properties文件,该文件下引用了一个css样式文件和一个js文件:
standard.custom.css.file=/css/cas.css
cas.javascript.file=/js/cas.js
- css配置
webapps下有个themes文件夹,下一级文件夹命名与cas.viewResolver.basename
中的前半段名称相匹配,如cas.viewResolver.basename=custom_views
时,则文件夹的名称应为:custom
-
视图配置——静态页面文件夹,对应basename
我们知道CAS基本的框架是MVC,视图配置则定义了每个类与页面之间的映射关系,页面都需要使用jsp格式。
文件路径在:src\main\webapp\WEB-INF\view\jsp*
三、实现原理分析
- 主题解析器
cas的bean里有一个themeresolver
,注入了servicesManager。实现类ServiceThemeResolver中的resolveThemeName方法查询并返回对应的主题配置信息。
<!-- Theme Resolver -->
<bean id="themeResolver" class="org.jasig.cas.services.web.ServiceThemeResolver"
p:defaultThemeName="${cas.themeResolver.defaultThemeName}"
p:argumentExtractors-ref="argumentExtractors"
p:servicesManager-ref="servicesManager">
<property name="mobileBrowsers">
<util:map>
<entry key=".*iPhone.*" value="iphone"/>
<entry key=".*Android.*" value="iphone"/>
<entry key=".*Safari.*Pre.*" value="iphone"/>
<entry key=".*Nokia.*AppleWebKit.*" value="iphone"/>
</util:map>
</property>
</bean>
@Override
public String resolveThemeName(final HttpServletRequest request) {
if (this.servicesManager == null) {
return getDefaultThemeName();
}
final Service service = WebUtils.getService(this.argumentExtractors, request);
final RegisteredService rService = this.servicesManager.findServiceBy(service);
// retrieve the user agent string from the request
String userAgent = request.getHeader("User-Agent");
if (userAgent == null) {
return getDefaultThemeName();
}
for (final Map.Entry<Pattern, String> entry : this.overrides.entrySet()) {
if (entry.getKey().matcher(userAgent).matches()) {
request.setAttribute("isMobile", "true");
request.setAttribute("browserType", entry.getValue());
break;
}
}
//查询为服务个性化配置的主题配置
return service != null && rService != null && StringUtils.hasText(rService.getTheme())
? rService.getTheme() : getDefaultThemeName();
}
-
视图解析器
cas-servlet.xml中一个bean。
<!-- View Resolver --> <bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:order="0"> <property name="basenames"> <util:list> <value>${cas.viewResolver.basename}</value> <value>protocol_views</value> </util:list> </property> </bean>
public class ResourceBundleViewResolver extends AbstractCachingViewResolver implements Ordered, InitializingBean, DisposableBean { /** The default basename if no other basename is supplied. */ public final static String DEFAULT_BASENAME = "views"; private int order = Integer.MAX_VALUE; // default: same as non-Ordered //我们可以看到basenames是一个数组 private String[] basenames = new String[] {DEFAULT_BASENAME};
四、总结
cas页面、主题的正确配置方法:
-
基于service管理的主题,其basename必须保持一致,即属于同一套视图,否则会出现报错,因为视图解析时是基于一个文件夹实现静态文件与视图的映射;反例:
-
当页面变化很大,不能通过配置新的css、js来实现新的主题时,可以考虑新建一套视图,如采用新的前端技术架构。这时需要新配置一个basename。
-
当页面实现技术不变,仅通过css、js即可实现样式调整,新建theme即可。