cas的主题配置与管理

cas的主题配置与管理

一、简介

​ cas可以实现动态多主题的管理,同一个cas访问不同的应用的时候可以做到千人千面,即根据访问服务的不同,如数据中心、开放平台,可以在一个服务端上实现不同的登录样式。

在这里插入图片描述

提问

  • 什么时候去新建basename?

  • 什么时候去新建theme?

当页面变化很大,不能通过配置新的css、js来实现新的主题时,可以考虑新建一套视图,如采用新的前端技术架构。这时需要新配置一个basename,否则新建theme即可。

二、主题的配置

cas配置核心文件为:cas.properties

所有的配置都和下面2个配置息息相关:

  • cas.themeResolver.defaultThemeName配置的是默认主题;

  • cas.viewResolver.basename是静态页面所在文件夹,且只能设置一个,如果页面结构、样式不去大改,我们定义一个新主题就可以啦。

目前我们的cas中共有3个主题样式:

ThemeNamebasename页面映射配置
cas-theme-defaultcustom_viewscustom_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即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子涵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值