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同步。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM