zoukankan      html  css  js  c++  java
  • php读取memcahed java session

    PHP 共享 JAVA 保存的session信息

    情景:

    1:现在有两个系统,一个是Java做的系统,一个是PHP的系统,现在要把两个系统弄成一个单点登录。

    2:两个系统两个库,两个库的表结构完全不同,现在要解决的就是session共享问题和用户信息的同步。

    方法:::

    1:java系统为主系统,php那边的登录,退出,注册都跳到java那边系统去登录。

    2:java系统那边可以创建一个“session表“存的是每个用户对应session信息。php那边就要根据用户ID去‘session表’,存在取出相关信息,做登录。因为要维护两个库,所以php那边要查询自己库中是否存在这个用户,不存在需要添加。(没用这种方式,需要维护session的生命周期太麻烦)

    3 **:创建”一个sesison表“对两边的系统都要付出比较大的代价,而且每次都要查数据库,session有效期维护那边程序也很复杂。所以借组于“memcache",tomat 于memcache整合(http://bbhaiidreamer.blog.51cto.com/3398980/841814)。这样的话,session信息就交memcache管理了。(项目采用这种方法)。

    4:JAVA 与 PHP 是一、二级域名,可以实现cookie共享。这样在php那边通过得到session_id 到memcache里面去取用户的信息。由于java跟php的memcache存的格式不一样。java存的时xml格式的,所以php还要做一些处理,通过session_id,取到对应的xml,再解析xml里面的内容。完后再做登录操作。存在,直接登录,不存在,入库再登录操作。

    java代码不用做什么处理,php这边的代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    function qa_get_logged_in_user(){
     // Until you edit this function, nobody is ever logged in
     // echo "<script>alert('get_logged_in_user');</script>";
          
     //从cookie里面取JSESSIONID,如果存在,取出session值
      if($_COOKIE['JSESSIONID']){
      //echo "<script>alert('COOKIE hava' );</script>";
      $session_id $_COOKIE['JSESSIONID'];
      }else{
      echo "<script>alert('COOKIE null ');</script>";
      }
         
     //连接memcachd,从memcache取用户信息
     $memcache new Memcache;     
     $memcache->connect('192.168.252.*', 11211) or die ("Could not connect");   
     $var $memcache->get($session_id);
         
     //解析从memcached取出来的xml,取到用户相关属性
     $xml_parser new PageXml();
     $date_xml $xml_parser->del_xml($var);
         
     if(empty($date_xml)){// 
       return null;
     }else{
          
      $results array($devName,$contact$email,$regTime,$devId);
      $devName $date_xml[0];
      $contant $date_xml[1];
      $email $date_xml[2];
      $regTime $date_xml[3];
      $devId $date_xml[4];
         
     // get in session or cookie.
          
      $qa_db_connection=qa_db_connection();
      $sql "SELECT userid,email,handle FROM t_users WHERE email='$email'";
      $result=mysql_fetch_assoc(mysql_query($sql,$qa_db_connection));
      //echo "<script>alert('get_logged_in_user-select user = $result');</script>";
             
      if (is_array($result)){
        return array(
         'userid' => $result['userid'],
         'publicusername' => $result['handle'],
         'email' => $result['email'],
         'level' => ($devName=='admin') ? 1: 0
        );
      }else{
       $insert_result = mysql_query("INSERT INTO t_users (created, createip, email, passsalt, passcheck, level, handle, loggedin, loginip,flags) ".
       "VALUES (NOW(), 0, '$email', '' , '',0, '$contant', NOW(),0,1)",$qa_db_connection);
       $d_id = mysql_insert_id(); //返回插入的userId
       //echo "<script>alert('get_logged_in_user-insert user = $insert_result,userid=$d_id');</script>";
           
      return array('userid'=> $d_id,
                 'publicusername' => $contant,
                  'email' => $email,
       'level' => ($devName=='admin') ? 1: 0);
      
         
         
     }
    }
         
        
    /*
    *  解析xml类 2012-11-13
    */
    class PageXml {
     function del_xml($var) {
          
     // echo $var;
      $first strpos($var ,"xml");//字符第一次出现的位置
      //echo "fist = ".$first."<br>";
     $last strrpos$var ,">");//字符最后一次出现的位置
     // echo "last = ".$last;
     $resultXml substr($var ,$first-2,$last);//截取字符串,形式如:substr($string,0,-3);
          
     $dom new DOMDocument('1.0');
     $dom ->loadXML($resultXml);
     //获取具体的节点
     $messages $dom->getElementsByTagName('v');   
         
     foreach ($messages as $book)   
     {
      $x_class $book->getAttribute('class');  
      if($x_class == 'com.kkpush.account.domain.Developer'){
          
        $devName $book ->getAttribute('devName');
        $contact $book ->getAttribute('contact');
        $email $book -> getAttribute('email');
        $regTime $book -> getAttribute('regTime');
        $devId $book -> getAttribute('devId');
        $results array($devName,$contact$email,$regTime,$devId);
       return $results;
      }
     }
          
      return null;
      
    }
         
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Memcache取出来的xml内容如下:
          
    3K:�x�<:�{H01:�{Hb#C9437013AB69ED7F06BF3E634E78AC27-n1<?xml version="1.0" encoding="UTF-8" ?>
    <attributes class="java.util.concurrent.ConcurrentHashMap" __id="0"
     size="3">
     <k class="java.lang.String" __id="1" value="userName" />
     <v class="java.lang.String" __id="2" value="kktalk" />
     <k class="java.lang.String" __id="3" value="user" />
    <!-- 这里就是用户的信息,只要解析这个就好了 -->
     <v class="com.youar.account.domain.Developer" __id="4" devId="91"
      devName="youa" contact="youra" password="youa"
      email="" QQ="9999999" regTime="2012-11-13 09:56:22.0"
      lastUpdateTime="2012-11-13 09:56:19.0" isEnabled="0" isActivation="0"
      activationCode="fab9ef6e-9e2c-43e1-8ab5-1fb473a9aeed"
      isCustomDiscount="0" clickRate="0.0" showRate="0.0"
      tempPasswordTime="2012-01-01 20:20:20.0" companyName="ktlak" />
     <k class="java.lang.String" __id="5" value="randCheckCode" />
     <v class="java.lang.String" __id="6" value="7386" />
    </attributes>

    ps: 由于php系统比较特殊,用户表中只需要维护几个关键字段而已。在这里讲的是正对于我目前的系统,只供参考,具体问题具体分析。如有说错的地方,望指正。

    暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。
  • 相关阅读:
    python基础之元组、文件操作、编码、函数、变量
    python---基础之模块,列表,元组,字典
    python成长之路-----day1-----作业(登录程序和三级菜单)
    k8s的port、targetport、nodeport之间的区别
    查找并删除文件
    systemctl自定义service
    中标麒麟7.0源
    springboot问题,没有主清单属性
    iso搭建本地源
    添加路由
  • 原文地址:https://www.cnblogs.com/zenghansen/p/3323946.html
Copyright © 2011-2022 走看看