首页 新闻 会员 周边

关于集群session问题提问,非常急,求助各位博主,谢谢

0
悬赏园豆:100 [已解决问题] 解决于 2018-12-24 17:39

服务器是was,前台winform,后台java和servlet

因为服务器是客户的,不能随便修改,我怎么才能确定客户服务器是否配置了集群session,

或者可不可以不修改服务器配置,在我这修改代码来实现session共享,

服务器有两台电脑:

当客户A登录时,假设此时在服务器A保存了session,此时客户A点击退出系统,退出系统这个过程,

是访问的服务器A还是服务器B?求解答

问题补充:

有没有人帮忙详解一下

菜鸟程序杜的主页 菜鸟程序杜 | 初学一级 | 园豆:65
提问于:2018-12-11 17:35
< >
分享
最佳答案
0

个人感觉你的可能是将session保存到了服务器文件中了,而客户给了你两台服务器应该是做了一定的负载均衡。
那么客户在访问服务器时,会随机访问其中的一台,如果说你的session数据在保存的其中一台服务器文件中的,那么另一台访问必然没有session 数据,除非做了共享硬盘(基本没这么做的)。

个人推荐:将session 数据保存到数据库或redis中。这样的话,无论用户登录还是退出都是从数据库或redis中取数据。

使用session的弊端:
1、需要维护session 服务器,增加了一定的时间成本
2、session存储的数据有一定的内存(硬盘)空间,增加了一定的空间成本

后期可以看看token的用法(个人建议)

收获园豆:100
xiaobaiskill | 小虾三级 |园豆:1087 | 2018-12-12 10:42

客户说他们的配置了was集群环境,但是问他们配没配置集群session共享,他们说不知道,也是醉了,问我怎么才能查看was是否配置了session共享,还想问一句负载均衡就是session共享的意思吗?

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-12 13:56

@菜鸟程序杜: 运维应该不需要管session的问题吧。你要想session 共享完全可以将session 数据存在数据库或者redis(or memcache) 中呀,这样通过端口连接数据库或redis不就可以实现两个服务器之间共享数据的问题了。 负载均衡 简单的说就是将原本一台服务器承受的并发压力 缓解到多台服务器上,达到均衡并发压力的目的

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-12 14:24

@xiaobaiskill: 服务器是was,前台winform,后台java和servlet,数据库是Oracle,我是在后台把session信息存储到数据库吗,数据库里的字段怎么创建,是什么类型的?还是只存储session id就行,不太会,请指教,感谢!

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-12 15:04

@菜鸟程序杜: 三个字段,session_id(key值),session_data(json数据,key-value),expire_date(过期时间),不知道你们有没有session 处理的中间件,可以找找看

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-12 15:11

@xiaobaiskill:

session_id我能找到,session_data是怎么获取,打扰了,求指教

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-12 15:59

@菜鸟程序杜: session_data ,是用户数据,一般存储有用户id,用户名。一般简单的网站cookie值就是session_id,通过session_id 获取用户数据id,通过用户id 用户的所有信息。session_data 里面一般存储你们常用的用户信息。

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-12 16:08

@xiaobaiskill: session里存储的信息都是键值对,session_data 的作用是存储这些键值对,对吗

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-12 16:56

@菜鸟程序杜: 对呀

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-12 16:57

@xiaobaiskill: 那我是不把一个session对象内的所有键值对都拼接在一起存入session_data,还是只存用户名。

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-12 17:02

@菜鸟程序杜: 最好和原来一样

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-12 17:06

@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;
}

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-12 17:07

@菜鸟程序杜: java对象转json , java我没有学过,你搜搜怎么转json 然后存储吧

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-12 17:11

@xiaobaiskill: 兄弟,我把session信息存到了db,但是拿出来的时候怎么把它赋值给session对象,我看session对象没有.setId()这个方法,只有getId()这个方法

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-13 14:44

@菜鸟程序杜: java 中怎么 json与session对象互转,这个我不清楚,但session 对象应该有create,setData,getData,del 这几个方法就可以了。
1、用户登录用create方法将用户的一些信息和生成的key_id 保存到数据中,
2、用户进入用户页面时,需要用getData 通过cookie 获取存在session 中的用户数据。
3、用户修改信息时,需要用setData 修改session_data 中的数据保存
4、用户注销的时候,del 删除数据就好了。

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-13 15:01

@xiaobaiskill: 如果session时间长了,用户就会强制下线了,但是此时db里还存在信息,能设置成实时吗,就算用户掉线了,db自动删除

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-13 17:23

@菜鸟程序杜: mysql 确实会存储session, 你可以使用liunx 写个定时器,定时清除就可以了。或者使用redis存储session(设置存储时间),都是可以的。

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-13 17:35

@菜鸟程序杜: 其实我个人更推荐使用token,有时间你可以看看token,不占空间,不用维护session服务器。

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-13 17:36

@xiaobaiskill: 好,我想试试redis这个,主要我什么都不会写不出来,而且还没有环境,只有客户有集群was服务器,而我只有汤姆猫。好烦啊

菜鸟程序杜 | 园豆:65 (初学一级) | 2018-12-13 17:49

@菜鸟程序杜: 应该有别人写好的redis 对象,写起来还是很简单的,也就增删改查,存储的数据类型有string,list(列表),hash(key=>value),set(集合)这些。你自己本地可以安装一个redis,java用起来应该还是很简单的吧。

xiaobaiskill | 园豆:1087 (小虾三级) | 2018-12-13 18:00
其他回答(1)
0
ycyzharry | 园豆:25651 (高人七级) | 2018-12-12 09:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册