代码如下:
>
tphp文件代码:
<php
OB_START();
@Session_start();
$sessionId = session_id();
echo $sessionId;
$_SESSION['abc']=123;
>
<a href=t2phpSESSIONID=<= $sessionId;>>获取session</a>
t2php文件代码:
<php
var_dump(session_id($_GET['SESSIONID']));
>
t2php也需要开启session:
<php
@Session_start();
var_dump(session_id($_GET['SESSIONID']));
> 《session_name() 返回当前session的名称》
CSDN创立于1999年,是中国最大的IT社区和服务平台,为中国的软件开发者和IT从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。拥有超过3000万注册会员(其中活跃会员800万)、50万注册企业及合作伙伴。
这个功能老版本servlet规范中有,新版本中好像被屏蔽了。可以换一种做法,写一个session监听。创建时将session id与session对象构造一个hashMap放到 application中去,销毁时从application中移除。然后你就可以获取了。
0什么是Redis
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
---维基百科
一般开发中用户状态使用session或者cookie,两种方式各种利弊。
Session:在InProc模式下容易丢失,并且引起并发问题。如果使用SQLServer或者SQLServer模式又消耗了性能
Cookie则容易将一些用户信息暴露,加解密同样也消耗了性能。
Redis采用这样的方案解决了几个问题,
1Redis存取速度快。
2用户数据不容易丢失。
3用户多的情况下容易支持集群。
4能够查看在线用户。
5能够实现用户一处登录。(通过代码实现,后续介绍)
6支持持久化。(当然可能没什么用)
2实现思路
1我们知道session其实是在cookie中保存了一个sessionid,用户每次访问都将sessionid发给服务器,服务器通过ID查找用户对应的状态数据。
在这里我的处理方式也是在cookie中定义一个sessionid,程序需要取得用户状态时将sessionid做为key在Redis中查找。
2同时session支持用户在一定时间不访问将session回收。
借用Redis中Keys支持过期时间的特性支持这个功能,但是在续期方面需要程序自行拦截请求调用这个方法(demo有例子)
下面开始代码说明
3Redis调用接口
首先引用ServiceStack相关DLL。
在webconfig添加配置,这个配置用来设置Redis调用地址每台服务用,隔开。主机写在第一位
1 <appSettings>
2
3 <!--每台Redis之间用,分割第一个必须为主机-->
4 <add key="SessionRedis" value="127001:6384,127001:6384"/>
5
6 </appSettings>
初始化配置
static Managers()
{
string sessionRedis= ConfigurationManagerAppSettings["SessionRedis"];
string timeOut = ConfigurationManagerAppSettings["SessionRedisTimeOut"];
if (stringIsNullOrEmpty(sessionRedis))
{
throw new Exception("webconfig 缺少配置SessionRedis,每台Redis之间用,分割第一个必须为主机");
}
if (stringIsNullOrEmpty(timeOut)==false)
{
TimeOut = ConvertToInt32(timeOut);
}
var host = sessionRedisSplit(charParse(","));
var writeHost = new string[] { host[0] };
var readHosts = hostSkip(1)ToArray();
ClientManagers = new PooledRedisClientManager(writeHost, readHosts, new RedisClientManagerConfig
{
MaxWritePoolSize = writeReadCount,//“写”链接池链接数
MaxReadPoolSize = writeReadCount,//“读”链接池链接数
AutoStart = true
});
}
为了控制方便写了一个委托
/// <summary>
/// 写入
/// </summary>
/// <typeparam name="F"></typeparam>
/// <param name="doWrite"></param>
/// <returns></returns>
public F TryRedisWrite<F>(Func<IRedisClient, F> doWrite)
{
PooledRedisClientManager prcm = new Managers()GetClientManagers();
IRedisClient client = null;
try
{
using (client = prcmGetClient())
{
return doWrite(client);
}
}
catch (RedisException)
{
throw new Exception("Redis写入异常Host:" + clientHost + ",Port:" + clientPort);
}
finally
{
if (client != null)
{
clientDispose();
}
}
}
一个调用的例子其他的具体看源码
/// <summary>
/// 以Key/Value的形式存储对象到缓存中
/// </summary>
/// <typeparam name="T">对象类别</typeparam>
/// <param name="value">要写入的集合</param>
public void KSet(Dictionary<string, T> value)
{
Func<IRedisClient, bool> fun = (IRedisClient client) =>
{
clientSetAll<T>(value);
return true;
};
TryRedisWrite(fun);
}
4实现Session
按上面说的给cookie写一个sessionid
/// <summary>
/// 用户状态管理
/// </summary>
public class Session
{
/// <summary>
/// 初始化
/// </summary>
/// <param name="_context"></param>
public Session(>
在jsp中使用js中的设置属性,进而获得session保存的属性值,实例如下:
session设置:
sessionsetAttribute("username",username);
sessionsetAttribute("password",password);
session获取:
username=sessiongetAttribute("username");
password=sessiongetAttribute("password");
下面主要介绍怎么在程序中,通过ebay api获得用户的token,这主要通过FetchTokenCall这个api获取。
这个api需要的额外参数有五个,appID,certID,devID,sessionID和serverURL,前三个需要注册开发者帐号获得,登录>
session的高级用法,
把session写到memcache或数据库里,就可以实现了
您也可以向我们团队发出请求,会有更专业的人来为您解答。
如果我的回答没能帮助您,请继续追问。
以上就是关于如何javaEE通过sessionId获取HttpSession对象全部的内容,包括:如何javaEE通过sessionId获取HttpSession对象、怎么获取session所有的值、php怎么通过sessionid获取session-CSDN论坛等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)