java web状态跟踪_Java Web 会话跟踪(四)

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术有Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录用户信息确定用户身份。

Web应用程序是使用HTTP协议传输的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。(典型案例加入购物车)

(一)、Cookie

Java中把Cookie封闭成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器端通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的Cookie(以Cookie[]数组形式返回),通过Response.addCookie(Cookie cookie)向客户端设置Cookie。

Cookie对象使用key-value属性对的形式保存用户状态。一个Cookie对象只保存一个属性对,一个request或者response同时使用多个Cookie。

服务器端只能获取当前用户的Cookie。各客户端的Cookie彼此独立,互不可见。

Unicode编码:保存中文

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中保存中文只能编码,一般使用UTF-8编码即可。

BASE64编码:保存二进制图片

Cookie的修改删除

Cookie并不提供修改、删除操作。如果要修改某个Cookie,需要新建一个同名的Cookie,并添加到response中覆盖原来的Cookie。如果要删除一个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,都要与原Cookiep完全一样。

(二)Session

Session定义

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户信息以某种记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户端档案表就可以了。

每个来访者对应一个Session对象,所有的该客户的状态信息都保存在这个Session对象中。Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(String key)和setAttribute(String key, Object value)访求读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session。request.getSession(Boolean create)来获取Session,如果该Session不存在,则创建。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建,只访问HTML、IMAGE等静态资源时不会创建Session。

HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一用户,因此服务器向客户端发送一个名为JSESSIONID的Cookie,它的值为Session的id(也就是HttpSession.getId()的返回值)

URL重写

URL地址重写是对客户端不支持Cookie的解决方案。URL重写的原理是将该用户Session的id信息写到URL地址中。服务器能够解释重写后的URL获取Session的id。这样即使客户端支持Cookie,也可以使用Session来记录用户的状态。HttpServletResponse类提供了encodeURL(String url)实现URL重写。该方法能够自动判断客户端是否支持Cookie。如果支持会将URL原封不动    输出,不支持则会把用户的Session的id重写到URL中。

浏览器第一次访问服务器时,请求中不带Cookie。

Cookie和Session比较

从存取方式比较

Cookie中只能保存ASCII码字符串,如果需要存取Unicode字符或二进制数据,需要进行UTF-8,GBK或者BASE64等方式进行编码。Session中可以存取任务类型有数据,能够存取JAVA对象。

从隐私安全方面

从有期方面

从对服务器的负担

从浏览器支持方面

从跨域名方面

喜欢 (0)or分享 (0)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值