• CAS 集群部署


    业务场景

    单点登录服务器如果压力过大的情况,那么可以使用集群分担压力,但是cas 默认不支持session同步。

    所以可以需要做session同步,可以使用j2cache 实现session同步。另外在登录后,cas服务器保存了客户端

    对应的ticketId,因此也需要将ticket实现同步。

    实现方法

    1.准备jar包

    将这些包copy 到cas的 WEB-INF/lib目录下

    2.编辑CAS web.xml 文件

    在web.xml 的

    <filter-mapping>
            <filter-name>encoding-filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    后面添加

     <filter>
        <filter-name>j2cache-session-filter</filter-name>
        <filter-class>net.oschina.j2cache.session.J2CacheSessionFilter</filter-class>
        <init-param><!-- 内存中存放会话数 -->
            <param-name>session.maxSizeInMemory</param-name>
            <param-value>2000</param-value>
        </init-param>
        <init-param><!-- 会话有效期,单位:秒钟 -->
            <param-name>session.maxAge</param-name>
            <param-value>1800</param-value>
        </init-param>
        <!-- cookie configuration -->
        <init-param>
            <param-name>cookie.name</param-name>
            <param-value>J2CACHE_SESSION_ID</param-value>
        </init-param>
        <init-param>
            <param-name>cookie.path</param-name>
            <param-value>/</param-value>
        </init-param>
        <init-param>
            <param-name>cookie.domain</param-name>
            <param-value></param-value>
        </init-param>
     
       
                <init-param>
                    <param-name>redis.mode</param-name>
                    <param-value>single</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.hosts</param-name>
                    <param-value>192.168.31.100:6379</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.channel</param-name>
                    <param-value>j2cache</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.cluster_name</param-name>
                    <param-value>j2cache</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.timeout</param-name>
                    <param-value>2000</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.password</param-name>
                    <param-value></param-value>
                </init-param>
                <init-param>
                    <param-name>redis.database</param-name>
                    <param-value>0</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.maxTotal</param-name>
                    <param-value>100</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.maxIdle</param-name>
                    <param-value>10</param-value>
                </init-param>
                <init-param>
                    <param-name>redis.minIdle</param-name>
                    <param-value>10</param-value>
                </init-param>
            </filter>
    
            <filter-mapping>
                <filter-name>j2cache-session-filter</filter-name>
                <url-pattern>/*</url-pattern>
            </filter-mapping>

    redis 可以做相应配置。

    3.ticket同步实现

    cas 服务器默认使用本地缓存来管理ticket,当使用集群实现时就会出现这样的情况。

    比如用户在CAS A登录,那么客户端就会获取到一个ST 票据,然后在验证这个票据去CAS服务器验证,

    如果这个时候请求发送到CAS B那么这个时候就会报错,说找不到ST,这个时候就需要做到ST票据在不同服务器上同步。

    我们可以看到cas 配置文件ticketRegistry.xml。

    他的默认配置为:

     <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />
        
        <!--Quartz -->
        <!-- TICKET REGISTRY CLEANER -->
        <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner"
            p:ticketRegistry-ref="ticketRegistry"
            p:logoutManager-ref="logoutManager" />
        
        <bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
            p:targetObject-ref="ticketRegistryCleaner"
            p:targetMethod="clean" />
        
        <bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean"
            p:jobDetail-ref="jobDetailTicketRegistryCleaner"
            p:startDelay="20000"
            p:repeatInterval="5000000" />

    我们可以看到这个 DefaultTicketRegistry的代码如下:

    他是简单的把票据放到一个ConcurrentHashMap对象中。

    所以我们需要设计一个自己的票据注册器,能够支持集群式部署。

    我们可以设计一个自己的票据注册器,我们可以使用redis,或memache来实现。

    public class J2CacheTicketRegistry extends AbstractDistributedTicketRegistry implements DisposableBean{
    
        private ICache cache;
        
        private  int tgtTimeout;
     
        private  int stTimeout;
        
        
        
        public void setTgtTimeout(int tgtTimeout) {
            this.tgtTimeout = tgtTimeout;
        }

    在ticketRegistry.xml中注册。

    <bean id="ticketRegistry" class="com.redxun.cas.J2CacheTicketRegistry">
          <property name="cache" ref="iCache"></property>
          <property name="tgtTimeout" value="28800"></property>
          <property name="stTimeout" value="28800"></property>
      </bean>
      <bean id="iCache" class="com.redxun.cas.J2CacheImpl" init-method="init" destroy-method="destroy"></bean> 

    4.NGINX配置

    upstream linuxidc {
                server 192.168.31.77:8082;
                server 192.168.31.77:8081;
            
            }

    添加cas配置

    location /cas {
                            proxy_pass http://linuxidc/cas;
                            proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-Ip $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
            }

    这样就实现了cas session同步。

  • 相关阅读:
    SGU180:Inversions(树状数组)
    Android布局中match_parent和fill_parent的差别
    上拉电阻和下拉电阻
    iOS应用性能调优的25个建议和技巧
    《拼音字母》 蓝桥杯复试试题
    构建轻量级的Table View注意事项[UIKit]
    Spark学习(一) 基本操作
    水滴状的自己定义视图,让您摆脱单调的Dialog
    【Scala】使用Option、Some、None,避免使用null
    基于tornado实现web camera
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/11028014.html
Copyright © 2020-2023  润新知