JavaWeb 会话Cookie看这一篇就够了,超详细!

1.会话跟踪技术概述

什么是会话? 

可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能包含多次请求和响应
   例如你给10086打电话,你就是客服端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在你一个会话中。

  在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到  客户关闭了浏览器会话结束。

一个会话的多个请求中共享数据,这就是会话跟踪技术,例如在一个会话中的请求如下:

  • 请求银行主页
  • 请求登录(请求参数是用户名和密码)
  • 请求转账(请求参数与转出相关的数据)
  • 请求信用卡还款(请求参数与还款相关的数据)

  在这上会话中当前用户信息必须在这个会话中共享的,因为登录的是张三,那么在转账和还款时一定是相对张三的转账和还款!这就说明我们必须在一个会话过程中有共享数据的能力。

2.Cookie

2.1什么是Cookie

  Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器发送给客户端浏览器的小甜点。Cookie本质上就是一个Map结构的键值对,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

2.2Cookie的规范

  1. Cookie大小上限为4KB。
  2. 一个服务器最多在客户端浏览器上保存20个Cookie。
  3. 一个浏览器最多保存300个Cookie。
  4. 不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。
  5. 如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

2.3Cookie的方法

Cookie的创建

Cookie中存放的是map形式的,键值对。

 Cookie cookie = new Cookie("name","zs");

获取Cookie

 Cookie[] cookies = request.getCookies();

可以用if语句和for循环,以及getName和getValue来展示出所有的Cookie

        if(cookies!=null && cookies.length>0) {
            for (Cookie cookie : cookies) {
                response.getWriter().write(cookie.getName()+","+cookie.getValue());
            }
        }

2.4Cookie的生命时长

Cookie对象不只是有name和value,Cookie还是生命时长属性
所谓生命时长就是指Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。

  1. cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
  2. cookie.setMaxAge(60*60):以秒为单位,表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活指定时间。
  3. cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie,前提必须路径一致

2.5Cookie的Path

2.5.1 什么是Cookie的path路径

现在有WEB应用A,向客户端发送了10个Cookie,这就说明客户端无论访问应用A的哪个Servlet都会把这10个Cookie包含在请求中!但是也许只有AServlet需要读取请求中的Cookie,而其他Servlet根本就不会获取请求中的Cookie。这说明客户端浏览器有时发送这些Cookie是多余的

我们可以通过设置Cookie的path来告知浏览器,在访问什么样的路径时,包含什么样的Cookie,这就是Cookie path路径的作用。

2.5.2 Cookie路径与请求路径的关系

当我们访问的路径中包含此cookie的path,则携带.

假设,下面是客户端浏览器保存的3个Cookie的路径:

  • Cookie a: /JavaWebTest02
  • Cookie b: /JavaWebTest02/servlet
  • Cookie c: /JavaWebTest02/jsp

下面是浏览器请求的Servlet URL:

  • Servlet A: http://localhost:8080/JavaWebTest02/AServlet 。
  • Servlet B: http://localhost:8080/JavaWebTest02/servlet/BServlet
  • Servlet C: http://localhost:8080/JavaWebTest02/jsp/CServlet 。

 请求Servelt A时,会在请求中包含Cookie a。
 请求Servelt B时,会在请求中包含Cookie a、Cookie b。
请求Servelt C时,会在请求中包含Cookie a、Cookie c。

也就是说,请求路径如果包含了Cookie路径,那么会在请求中包含这个Cookie,否则请求中不会包含这个Cookie。

2.5.3 设置Cookie的路径

设置路径后,只有访问该路径,浏览器向服务器发送时会携带Cookie

cookie.setPath(“/JavaWebTest02/servlet”);

2.5.4 Cookie的中文乱码问题

Cookie的name和value默认是不能使用中文,如果希望在Cookie中使用中文,name需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。

编码:

String user = URLEncoder.encode("中文","UTF-8") ;

解码:

String value = URLDecoder.decode(cookie.getValue(),"UTF-8");
关于会话,还有重要的知识点session,关注我,马上更新哦~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值