请教各个大哥们一个很重要的问题,就是能不能读取到ie浏览器中的session值,不用监控的办法。请大哥们谈谈吧。

http协议好像是tcp/ip协议的扩展,即是面向连接的
既然是面向连接的,应该什么都好办了啊!!!

迷惑!


关于HttpSession的误解实在是太多了,本来是一个很简单的问题,怎会搞的如此的复杂呢?下面说说我的理解吧:
1、HTTP协议本身是“连接-请求-应答-关闭连接”模式的,是一种无状态协议(HTTP只是一个传输协议);
2、Cookie规范是为了给HTTP增加状态跟踪用的(如果要精确把握,建议仔细阅读一下相关的RFC),但不是唯一的手段;
3、所谓Session,指的是客户端和服务端之间的一段交互过程的状态信息(数据);这个状态如何界定,生命期有多长,这是应用本身的事情;
4、由于B/S计算模型中计算是在服务器端完成的,客户端只有简单的显示逻辑,所以,Session数据对客户端应该是透明的不可理解的并且应该受控于服务端;Session数据要么保存到服务端(HttpSession),要么在客户端和服务端之间传递(Cookie或url rewritting或Hidden input);
5、由于HTTP本身的无状态性,服务端无法知道客户端相继发来的请求是来自一个客户的,所以,当使用服务端HttpSession存储会话数据的时候客户端的每个请求都应该包含一个session的标识(sid, jsessionid 等等)来告诉服务端;
6、会话数据保存在服务端(如HttpSession)的好处是减少了HTTP请求的长度,提高了网络传输效率;客户端session信息存储则相反;
7、客户端Session存储只有一个办法:cookie(url rewritting和hidden input因为无法做到持久化,不算,只能作为交换session id的方式,即a method of session tracking),而服务端做法大致也是一个道理:容器有个session管理器(如tomcat的org.apache.catalina.session包里面的类),提供session的生命周期和持久化管理并提供访问session数据的api;
8、使用服务端还是客户端session存储要看应用的实际情况的。一般来说不要求用户注册登录的公共服务系统(如google)采用cookie做客户端session存储(如google的用户偏好设置),而有用户管理的系统则使用服务端存储。原因很显然:无需用户登录的系统唯一能够标识用户的就是用户的电脑,换一台机器就不知道谁是谁了,服务端session存储根本不管用;而有用户管理的系统则可以通过用户id来管理用户个人数据,从而提供任意复杂的个性化服务;
9、客户端和服务端的session存储在性能、安全性、跨站能力、编程方便性等方面都有一定的区别,而且优劣并非绝对(譬如TheServerSide号称不使用HttpSession,所以性能好,这很显然:一个具有上亿的访问用户的系统,要在服务端数据库中检索出用户的偏好信息显然是低效的,Session管理器不管用什么数据结构和算法都要耗费大量内存和CPU时间;而用cookie,则根本不用检索和维护session数据,服务器可以做成无状态的,当然高效);

服务器会在用户浏览器第一次访问的时候产生一个session和一个独一的sessionid。我实现了HttpSessionListener然后
public void sessionCreated(HttpSessionEvent event) {
id=event.getSession().getId();
}
用户登陆时把这个id给user的一个idno字段,这样管理时可以捕获这个sessionid
问题:能不能由这个sessionid捕获与其对应的session???

很容易,只需要用一个Singleton的HashMap保存一下sessionid-->session object的映射就可以了,这时还需要实现HttpSessionListener的sessionDestroyed方法,在session超时或被invalidate时从这个map里面remove一下,否则无法垃圾回收。

所谓的“会话cookie”简单的说就是没有明确指明有效期的cookie,仅在浏览器当前进程生命期内有效,可以被后继的Set-Cookie操作清除掉;holykeeper还是很有敬业精神的!记得3年前偶刚刚开始做J2EE的时候就做过同样的事情,不过我用的是Effetech HTTP Sniffer和Charles HTTP Proxy,另外,我一口气把HTTP RFC 2616,Cookie RFC,URI & URL,MIME等十多个与Web相关的协议标准通读了一遍,在之后的工作中就再也没有被具体的技术问题纠缠过。

请问,如果sessionId被保存到浏览器内存中,在使用httpUrlConnection发送请求时如何手动实现将sessionId发送给服务器?现在的测试结果是,在有的浏览器下会自动给予发送,但有些浏览器却不行?
也就是在applet中的session 在与asp/jsp通讯时如何保持session?一下是我的测试代码

URL url = new URL(getDocumentBase(), postURL); httpConnection = (HttpURLConnection) url .openConnection(); httpConnection.setDoInput(true); httpConnection.setDoOutput(true); httpConnection.setUseCaches(false);
int responseCode = httpConnection.getResponseCode();

thanks

fskjjj

Tomcat的session机制确实是使用cookie的,你用firefox的firebug或者独立的httplook工具可以看到在tomcat与浏览器交互的过程中始终有:

Cookie JSESSIONID=BA464CCBD4BE0BE4FD18958D7C8EE001

(后面的sessionid值各有不同)

sessionid值的生成与客户端浏览器还有地址有关系。