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