zoukankan      html  css  js  c++  java
  • 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同步。

  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/11028014.html
Copyright © 2011-2022 走看看