浅谈jSessionID

关于JSessionID

servlet规范中,HttpServletSession的获取时通过调用request.getSession(boolean createnew)方法来实现,其实现机制可以简单的理解为存在一个大的hashMap结构,key就是jsessionid,而valuleHttpservletSession对象。 request.getSession(boolean createnew)方法通过jsessionid来获取对应的HttpservletSession,如果不存在并且参数createnew= true,则创建一个新的HttpservletSession对象,并设置jsessionid=session.getId() ,保存到hashMap结构中。以后再传递这个jsessionid. 

 

jsessionid的传递可以是以下途径

   1. 放在cookie

        Cookie: JSESSIONID=abcrmF3Gx-5Z-hhkgHfzr
    2. 
以参数形式放在url
        http://10.3.2.35:11280/wmail/welcome.action?jsessionid=abcQNqiT4C01rg-necLBr
    3. 
form表单传递,通常是用隐藏域
        <input type="hidden" name="jsessionid" value="abcQNqiT4C01rg-necLBr"/>
    4. url
重写
        http://10.3.2.35:11280/jid=abcQNqiT4C01rg-necLBr/wmail/welcome.action
           
或者
        http://10.3.2.35:11280/wmail/welcome.action;jsessionid=abcQNqiT4C01rg-necLBr
    
如果当前还没有jsessionid则当然就无法获取,通常用户第一次访问或者登录前就是这种情况.
    
可以通过request.getRequestedSessionId() 方法来获取本次http 请求的jsessonid值。

 

获取到的HttpServletSession对象

如果HttpServletSession对象是已经存在的,则
    1. session.isNew()=false
    2. request.getRequestedSessionId() == jsessionid == session.getId()
    
如果HttpServletSession对象是调用request.getSession(true) (简写的request.getSession()方法等同于request.getSession(true) )时新创建的,则有以下特征:
    1. session.isNew()=true
    2. 
以后传递的jsessionid=session.getId()
        
注意这里,如果request.getRequestedSessionId() 是空值,情况比较简单,以后传递jsessionid=session.getId()就是了。
        
但是如果request.getRequestedSessionId() 不是空值,通过这个值没有获取到已经存在的session对象,而是返回了一个新的session对象,这个时候新的session.getId()和原有的request.getRequestedSessionId() 关系如何呢?下面详细阐述这种情况。

 

比较JsessionIDCookies

http本身是无session的,无法跟踪客户端的信息,换句话说:http协议不管是谁联接自己。 
为了实现session,必须有浏览器支持。浏览器可以用cookie存储session,这是最通用的做法。 
但是,如果我自己写一个完全符合http协议的浏览器,但是不配合服务器的session要求,那么服务器就无法产生session 
好在现在的浏览器都支持session要求,即使关闭了cookie,浏览器也会向服务器传递sessionid,这个id是存储在浏览器的内存空间中的,不保存在硬盘cookie中。 

 

session是在服务器端保存。服务器根据url请求中的session_id来查找对应的session 

以一个bbs为例,网站需要根据每个请求url获取用户的信息,如果以cookie方式,用户信息全部是存放在cookie中的,这样可能会不安全;如果以session方式,用户信息可以存放在服务器端,服务器只要从http请求中得到session_id,就可以得到存放在session中的用户信息了,这样安全性比较高。session在服务器中的表现方式依服务器而定,可能是写到临时文件中,也可能直接放在内存中。 

服务器从http请求中得到session_id的方式有两种:cookieurl重写。如果客户端启用cookie,那么session_id可以保存在cookie中;如果禁用cookie,就用url重写方式,在url中添加.jsessionid=xxxxx参数部分,服务器会试图从url中得到.jsessionid参数作为session_id. 

 

http的报文格式里面cookiesession是在同一个包文位置上的 
如果ie发现包文里面包含cookie/session的信息的话,他会根据安全级别来决定是否保存相关信息,比如,如果安全机制允许使用cookie那么ie将把cookie的信息保存到临时文件里面,每次在请求服务器文件的时候会把收到的session的信息加入到请求的报文里面,这就是session保存信息的原理。如果安全机制不允许使用cookie的话,虽然ie收到了cookiesession的信息,那么cookie的信息不会被写入临时文件,当ie再次请求服务器文件的时候,也不会把收到的session的信息加入到请求报文里面,服务器就无法知道session的信息了。 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值