tomcat叢集共用session(nginx+redis)__tomcat

來源:互聯網
上載者:User

nginx+tomcat+redis配置session共用和負載平衡

使用nginx作為前端伺服器,將需要的session存入到redis中,當tomcat有一台掛了後,session還能從redis中取到。

在這裡有兩種方案。

方案一:使用tomcat-redis-seesion-manager,將jar包放入tomcat的lib中。


jar下載:

tomcat-redis-session-manage-tomcat7.jar

commons-pool2-2.2.jar

jedis-2.5.2.jar

jar包下載地址:http://download.csdn.net/detail/lh2420124680/9904714

修改tomcat的context.xml檔案,

加入:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />  
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
             host="localhost"  
             port="6379"  
             database="0"  
             maxInactiveInterval="60" />
然後按照方案二的nginx配置,啟動tomcat和nginx


方案二:在代碼中使用redis來處理邏輯。

1.nginx.conf的配置


在這裡取了一個clu作為叢集的名字,下面有兩個伺服器(兩個tomcat,修改為不同的連接埠),這裡主要是做負載平衡,nginx會把請求轉寄到不同的伺服器中,減少訪問的壓力。

其中的location ~ (.*\.(jpg|jpeg|png|ico|gif|css|js|html))配置是因為項目中有post請求靜態資源,因為nginx不允許post請求靜態資源,所以在這裡配置了一下,請求如果是405就轉200.

然後在登入的代碼中加入redis的儲存方法


在這裡,我將session資料轉成json的string類型,然後escape存入redis,不然redis會把“”號等特殊符號轉義,取出來就不是原來的資料了,所以取出來用unescape

下面是escape和unescape的方法

public static String escape(String src) {  
        int i;  
        char j;  
        StringBuffer tmp = new StringBuffer();  
        tmp.ensureCapacity(src.length() * 6);  
        for (i = 0; i < src.length(); i++) {  
            j = src.charAt(i);  
            if (Character.isDigit(j) || Character.isLowerCase(j)  
                    || Character.isUpperCase(j))  
                tmp.append(j);  
            else if (j < 256) {  
                tmp.append("%");  
                if (j < 16)  
                    tmp.append("0");  
                tmp.append(Integer.toString(j, 16));  
            } else {  
                tmp.append("%u");  
                tmp.append(Integer.toString(j, 16));  
            }  
        }  
        return tmp.toString();  
    }  


public static String unescape(String src) {  
      StringBuffer tmp = new StringBuffer();  
      tmp.ensureCapacity(src.length());  
      int lastPos = 0, pos = 0;  
      char ch;  
      while (lastPos < src.length()) {  
          pos = src.indexOf("%", lastPos);  
          if (pos == lastPos) {  
              if (src.charAt(pos + 1) == 'u') {  
                  ch = (char) Integer.parseInt(src  
                          .substring(pos + 2, pos + 6), 16);  
                  tmp.append(ch);  
                  lastPos = pos + 6;  
              } else {  
                  ch = (char) Integer.parseInt(src  
                          .substring(pos + 1, pos + 3), 16);  
                  tmp.append(ch);  
                  lastPos = pos + 3;  
              }  
          } else {  
              if (pos == -1) {  
                  tmp.append(src.substring(lastPos));  
                  lastPos = src.length();  
              } else {  
                  tmp.append(src.substring(lastPos, pos));  
                  lastPos = pos;  
              }  
          }  
      }  
      return tmp.toString();  
  }  

redis取出資料



然後分別啟動兩個tomcat,登入,然後關閉一台tomcat,測試使用者是否登入.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.