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

php读取memcahed java session的更多相关文章

  1. Java Session 会话技术

    什么是Java Session? 大图:http://images2017.cnblogs.com/blog/1030087/201712/1030087-20171223235950881-1310 ...

  2. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...

  3. java session 详解

    原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于tra ...

  4. Java Session 介绍;

    为什么需要Session 这是为了填补 Http 协议的局限,当用户去访问一个页面,服务端返回完了请求(如,你访问完一个网页,这个页面将页面内容,界面UI呈现给你),就算是结束了,就断开了,服务端不再 ...

  5. 学习记录 java session保存用户登录

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. 依据不同的操作系统读取配置文件/java读取属性文件代码

    package cn.com.css.common.util; /**  * @brief OSEnum.java 操作系统的枚举  * @attention  * @author 涂作权  * @d ...

  7. 关于JAVA SESSION的小测试

    手生就要多练啊... package com.jeelearning.servlet; import java.io.IOException; import java.io.PrintWriter; ...

  8. java session cookie的使用

    Cookie; Session; URL重写; cookie在J2EE项目中的使用,Java中把Cookie封装成了java.servlet.http.Cookie类.每个Cookie都是该Cooki ...

  9. (记录)Jedis存放对象和读取对象--Java序列化与反序列化

    一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...

随机推荐

  1. Android种 adb是什么(转)

    提到adb.exe,一直关注我们Android系列教程的朋友们应该不会感到陌生,因为无论取得 Root权限或者刷机的时候我们都通过adb直接操作管理Android手机,但是可能大多数对于adb仅仅局限 ...

  2. 建模算法(四)——动态规划

    其实我们对着规划接触的最多最熟悉,简单来说就是一个递归问题,递归问题简单的在的地方,编程实现的难度下降了,难的地方是如何构造递归,不好的地方是资源的浪费,但是有些地方编程实现的简单的优势可以无视掉他的 ...

  3. Python实现的粒子群优化算法

    01.from numpy import array 02.from random import random 03.from math import sin, sqrt 04. 05.iter_ma ...

  4. XmlBeanFactory的Bean加载

    如何使用这些bean,bean加载的探索: MyTestBean bean=(MyTestBean) bf.getBean("myTestBean"); AbstractBeanF ...

  5. Maven中多模块的编译顺序

    在多模块的工程中,如果模块之间存在依赖关系,那模块的编译必须要有顺序的要求.例如:P(parent)中包含A模块和B模块,且A模块依赖于B模块,那么在P中的pom,xml中需申明为: <modu ...

  6. HDU3996 Gold Mine(最大权闭合子图)

    #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using ...

  7. HDU2825 Wireless Password(AC自动机+状压DP)

    题目问长度n至少包含k个咒语的字符串有多少个.也是比较入门的题.. dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0] ...

  8. 洛谷 P2024 食物链 POJ 1182 Label:并查集Turbo

    题目描述 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A 吃 B,B 吃 C,C 吃 A. 现有 N 个动物,以 1 - N 编号.每个动物都是 A,B,C 中的一种,但是我 ...

  9. CSS3盒模型display:box详解

    display:box;box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box ...

  10. oracle系列--第六篇 Oracle上面小试牛刀

    现在我们可以在oracle上面进行创建表,向表中插入数据,修改表中数据,删除数据,甚至删除表等一系列操作. 即我们所说的CRUD操作. --create a table which name is t ...