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系统比较特殊,用户表中只需要维护几个关键字段而已。在这里讲的是正对于我目前的系统,只供参考,具体问题具体分析。如有说错的地方,望指正。
php读取memcahed java session的更多相关文章
- Java Session 会话技术
什么是Java Session? 大图:http://images2017.cnblogs.com/blog/1030087/201712/1030087-20171223235950881-1310 ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...
- java session 详解
原网址:http://blog.sina.com.cn/s/blog_670b6d880101deff.html 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于tra ...
- Java Session 介绍;
为什么需要Session 这是为了填补 Http 协议的局限,当用户去访问一个页面,服务端返回完了请求(如,你访问完一个网页,这个页面将页面内容,界面UI呈现给你),就算是结束了,就断开了,服务端不再 ...
- 学习记录 java session保存用户登录
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 依据不同的操作系统读取配置文件/java读取属性文件代码
package cn.com.css.common.util; /** * @brief OSEnum.java 操作系统的枚举 * @attention * @author 涂作权 * @d ...
- 关于JAVA SESSION的小测试
手生就要多练啊... package com.jeelearning.servlet; import java.io.IOException; import java.io.PrintWriter; ...
- java session cookie的使用
Cookie; Session; URL重写; cookie在J2EE项目中的使用,Java中把Cookie封装成了java.servlet.http.Cookie类.每个Cookie都是该Cooki ...
- (记录)Jedis存放对象和读取对象--Java序列化与反序列化
一.理论分析 在学习Redis中的Jedis这一部分的时候,要使用到Protostuff(Protobuf的Java客户端)这一序列化工具.一开始看到序列化这些字眼的时候,感觉到一头雾水.于是,参考了 ...
随机推荐
- JFrame类 和 JOptionPane类
import javax.swing.JFrame; import javax.swing.JOptionPane; public class Ch2Sample1 { public static v ...
- 开始写github
公司即将开发手机钱庄网,于是最近在写一些手机上常用的js组件做前期准备. 之所以没有沿用pc的那些插件,原因是: 之前的插件大多数是使用jquery写的 移动端的性能要求更严格 以前写的插件从现在看看 ...
- php升级5.3到5.4,5.5,5.6
Laravel要求php大于5.5.9,升级php5.3.3到5.6.14(最新版为 5.6.15 ) Add EPEL and Remi repositories onto your system: ...
- C#图片处理示例(裁剪,缩放,清晰度,水印)
C#图片处理示例(裁剪,缩放,清晰度,水印) 吴剑 2011-02-20 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 前言 需求源自项目中的一些应用,比 ...
- DataTable转换成List<T>
很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ...
- BZOJ2819 Nim(DFS序)
题目:单点修改.树链查询. 可以直接用树链剖分做.. 修改是O(QlogN),查询是O(QlogNlogN),Q=N=500000: 听说会超时.. 这题也可以用DFS序来做. 先不看修改,单单查询: ...
- List<T>的使用
定义:List<T>类表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索.排序和操作的方法. 作用:泛型最常见的用途是泛型集合我们在创建列表类时,列表项的数据类型可能是int,s ...
- POJ2828 Buy Tickets
题意:依次给出n个插队的情况——k,name.即标号为name的这个人插到k后,且这个过程有时间顺序. 思路:很容易想到从后往前插,也很容易想到用线段树维护个数,但是某些细节wa了很多次,代码和网上的 ...
- Codeforces 55D (数位DP+离散化+数论)
题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...
- 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...