服务器是was,前台winform,后台java和servlet
因为服务器是客户的,不能随便修改,我怎么才能确定客户服务器是否配置了集群session,
或者可不可以不修改服务器配置,在我这修改代码来实现session共享,
服务器有两台电脑:
当客户A登录时,假设此时在服务器A保存了session,此时客户A点击退出系统,退出系统这个过程,
是访问的服务器A还是服务器B?求解答
有没有人帮忙详解一下
个人感觉你的可能是将session保存到了服务器文件中了,而客户给了你两台服务器应该是做了一定的负载均衡。
那么客户在访问服务器时,会随机访问其中的一台,如果说你的session数据在保存的其中一台服务器文件中的,那么另一台访问必然没有session 数据,除非做了共享硬盘(基本没这么做的)。
个人推荐:将session 数据保存到数据库或redis中。这样的话,无论用户登录还是退出都是从数据库或redis中取数据。
使用session的弊端:
1、需要维护session 服务器,增加了一定的时间成本
2、session存储的数据有一定的内存(硬盘)空间,增加了一定的空间成本
后期可以看看token的用法(个人建议)
客户说他们的配置了was集群环境,但是问他们配没配置集群session共享,他们说不知道,也是醉了,问我怎么才能查看was是否配置了session共享,还想问一句负载均衡就是session共享的意思吗?
@菜鸟程序杜: 运维应该不需要管session的问题吧。你要想session 共享完全可以将session 数据存在数据库或者redis(or memcache) 中呀,这样通过端口连接数据库或redis不就可以实现两个服务器之间共享数据的问题了。 负载均衡 简单的说就是将原本一台服务器承受的并发压力 缓解到多台服务器上,达到均衡并发压力的目的
@xiaobaiskill: 服务器是was,前台winform,后台java和servlet,数据库是Oracle,我是在后台把session信息存储到数据库吗,数据库里的字段怎么创建,是什么类型的?还是只存储session id就行,不太会,请指教,感谢!
@菜鸟程序杜: 三个字段,session_id(key值),session_data(json数据,key-value),expire_date(过期时间),不知道你们有没有session 处理的中间件,可以找找看
@xiaobaiskill:
session_id我能找到,session_data是怎么获取,打扰了,求指教
@菜鸟程序杜: session_data ,是用户数据,一般存储有用户id,用户名。一般简单的网站cookie值就是session_id,通过session_id 获取用户数据id,通过用户id 用户的所有信息。session_data 里面一般存储你们常用的用户信息。
@xiaobaiskill: session里存储的信息都是键值对,session_data 的作用是存储这些键值对,对吗
@菜鸟程序杜: 对呀
@xiaobaiskill: 那我是不把一个session对象内的所有键值对都拼接在一起存入session_data,还是只存用户名。
@菜鸟程序杜: 最好和原来一样
@xiaobaiskill: 我在百度上找到一个把session对象序列化的方法。但是报错
/**
* 将Session序列化成String类型
* @param session
* @return
*/
private String serializ(HttpSession session) {
try {
//ByteArrayOutputStream 用于存储序列化的Session对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//将Object对象输出成byte数据
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(session);
//将字节码,编码成String类型数据
return new String(bos.toByteArray());
} catch (Exception e) {
// throw new RuntimeException("序列化失败");
}
return null;
}
@菜鸟程序杜: java对象转json , java我没有学过,你搜搜怎么转json 然后存储吧
@xiaobaiskill: 兄弟,我把session信息存到了db,但是拿出来的时候怎么把它赋值给session对象,我看session对象没有.setId()这个方法,只有getId()这个方法
@菜鸟程序杜: java 中怎么 json与session对象互转,这个我不清楚,但session 对象应该有create,setData,getData,del 这几个方法就可以了。
1、用户登录用create方法将用户的一些信息和生成的key_id 保存到数据中,
2、用户进入用户页面时,需要用getData 通过cookie 获取存在session 中的用户数据。
3、用户修改信息时,需要用setData 修改session_data 中的数据保存
4、用户注销的时候,del 删除数据就好了。
@xiaobaiskill: 如果session时间长了,用户就会强制下线了,但是此时db里还存在信息,能设置成实时吗,就算用户掉线了,db自动删除
@菜鸟程序杜: mysql 确实会存储session, 你可以使用liunx 写个定时器,定时清除就可以了。或者使用redis存储session(设置存储时间),都是可以的。
@菜鸟程序杜: 其实我个人更推荐使用token,有时间你可以看看token,不占空间,不用维护session服务器。
@xiaobaiskill: 好,我想试试redis这个,主要我什么都不会写不出来,而且还没有环境,只有客户有集群was服务器,而我只有汤姆猫。好烦啊
@菜鸟程序杜: 应该有别人写好的redis 对象,写起来还是很简单的,也就增删改查,存储的数据类型有string,list(列表),hash(key=>value),set(集合)这些。你自己本地可以安装一个redis,java用起来应该还是很简单的吧。