servlet篇(三)【会话技术:Cookie和Session的使用】

复习JavaWeb—cookie和session会话技术

会话技术

一次会话:访问一个 web 应用,浏览器客户端和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束,关闭浏览器为止,这期间产生的多次请求和响应加在一次就称为浏览器客户端和服务器之间的一次会话。

由于 http 协议是无状态的协议,也就是说,当用户访问 web 应用时,服务器无法区分客户端的身份。就好比我们在某宝上结算购物车商品提交请求时,它的服务器就必须根据请求获取我们的身份,然后找到我们要结算的商品,这时候就需要用到会话技术。

总而言之,会话技术就是在同一个浏览器与服务器的多次请求间,将请求数据持久化存储的技术。作用就是存储会话中客户端的状态和数据。

会话技术分为两种:Cookie 和 Session.

  • Cookie:将数据存储在客户端本地,减少服务端的存储压力,安全性相对不强(可以被客户端清除)
  • Session:将数据存储在服务端,安全性相对较强,但是会增加服务器压力。

Cookie

Cookie的简要介绍

Cookie 是小段的文本信息,通过 Cookie 可以标识用户身份、记录用户名以及密码、跟踪重复用户(比如我们在浏览器打开了一个 web 应用并已经登录,此时在浏览器的新页面打开该 web 应用已经是登录状态)。

当客户端第一次访问 web 应用时,该 web 应用的服务端会生成一个 Cookie,通过 response 响应返回给客户端,客户端将 Cookie 保存到本地某个指定的目录下。当客户端再次访问该 web 应用时,该 web 应用对应的 Cookie 会跟着 request 请求一起到该 web 应用的服务端,服务端会查看 Cookie 中记录的信息,并根据该信息返回相对应的信息给客户端。

Cookie 是以键值对(name-value)的形式存储在本地硬盘中,用户可以手动清除 Cookie 信息或者服务器设置 Cookie 在客户端的持久化时间,当过了持久化时间后,浏览器自动删除对应的 Cookie 信息(如果不设置持久化时间,当浏览器关闭时该 Cookie 信息就会被清除)。

Cookie的常用方法

1)public Cookie(String name,String value)

Cookie 的构造方法,name 参数是该 Cookie 的唯一标识,不能包含等号 (=)、分号 (😉、逗号 (,)、换行符 (\n)、回车符 (\r)、制表符 (\t) 和空格字符,美元符号 ($) 不能作为第一个字符;value 是该 Cookie 的值,不能包含分号或逗号(除非它们包含在转义的双引号中)。

2)setValuegetValue

设置和获取 Cookie 值的方法

3)setMaxAgegetMaxAge

设置和获取 Cookie 的最大有效期(单位是秒)的方法;默认是 -1

4)setPathgetPath

设置和获取允许访问该 Cookie 的路径(即 Cookie 的path属性)。一般 Cookie 默认整个 web 应用都可以使用,可以设置只有该应用下的某路径能访问该 Cookie

5)setDomaingetDomain

设置和获取可以访问该 Cookie 的域名(即 Cookie 的domain属性)。domain的值规定为 “.域名”。Cookie 的隐私安全机制决定 Cookie 是不可跨域名访问。即 www.baidu.com 和 www.google.com 之间的 Cookie 是互不交接的,即使是同一级域名,不同二级域名也不能交接

6)String getName()

获取 Cookie 的name

Cookie应用

1)将 Cookie 加入到响应和请求中:

  • response 响应对象定义有 addCookie(Cookie cookie) 方法,用于在响应头上增加一个相应的 Set-Cookie 头字段;服务器通过响应消息将 Cookie 发送给客户端
response.addCookie(cookie)
  • request 请求对象定义有 getCookies() 方法,用于获取客户端提交的所有 Cookie(Cookie数组)
Cookie[] cookies = request.getCookies()

2)设置 Cookie 编码解决中文乱码问题:

见案例:

String name = "中华";
Cookie cookie = new Cookie("country",URLEncoder.encode(name,"UTF-8"));   //设置为utf-8编码

3)Cookie 的修改和删除:

Cookie 是没有提供删除 Cookie 的方法,也没有提供修改 Cookie 的方法,那么我们怎么修改或删除它呢?

我们知道,一个 Cookie 是由 name-value 的结构组成,而 name 是标识(找出)该 Cookie 的字段,现在是不是有想法了呢!

修改:Cookie 的 name 标识 Cookie,那么重写构造一个 name 相同,但 value 是我们想要的 Cookie

String name = "中国";
Cookie cookie = new Cookie("country",URLEncoder.encode(name,"UTF-8"));
response.addCookie(cookie);

name 为 country 的值已经改变了(本质上是新的 Cookie 覆盖了原来的 Cookie)。

删除:删除没有别的方法,只能设置 Cookie 的有效时间 MaxAge 的值:负数表示该 Cookie 是临时性的,关闭浏览器该 Cookie 就会失效;正数表示该 Cookie 的有效时间;0 表示删除该 Cookie

//仍然需要构造一个新的 Cookie 覆盖原来的 Cookie ,只不过 MaxAge 的值发生改变
String name = "中国";
Cookie cookie = new Cookie("country",URLEncoder.encode(name,"UTF-8"));
cookie.setMaxAge(0);
response.addCookie(cookie);

name 为 country 的 Cookie 已删除。

:修改、删除 Cookie 时,新建的 Cookie 除了 value、MaxAge 之外的所有属性都要与原 Cookie 相同,否则浏览器将视为不同的 Cookie,不予覆盖,导致修改、删除失败。

Session

Session的简要介绍

Cookie 技术可以将用户的信息保存在各自的浏览器中,并且可以在多次请求下实现数据的共享。但若是传递的信息比较多,使用 Cookie 技术显然会增大服务端处理的难度(服务器需要一个一个识别 Cookie 直至获取当前需要的 Cookie 信息 );而且 Cookie 存在本地存在信息安全性问题。对应的 Session 便应运而生。

Session 对象是由服务端自动创建的与用户请求相关的对象。服务器为每个用户都生成一个 Session 对象,用于保存该用户的信息,跟踪用户的操作状态。相对 Cookie,Session 是一种把会话数据保存在服务器的技术。

当浏览器第一次发送情求给 web 应用时,该 web 应用的服务器自动生成一个 Session 对象和一个 Session ID 用来唯一标识这个 Session 对象。随后服务端以 Session ID 的值创建一个 Cookie(name=JSESSIONID,value=Session ID的值) 并通过 response 响应将该 Cookie 发送给浏览器。

当浏览器第二次向该 web 应用发起请求时,会将此前产生的 name=JSESSIONID 的 Cookie 的值与服务端保存的所有 Session ID 进行对比,找到该用户(该浏览器)对应的 Session 对象,并继续使用该 Session 对象访问 web 应用。

一般来说,服务器会在一定的时间内(默认30分钟)保存这个 Session,过了时间后就会销毁这个 Session 对象。

Session的常用方法

1)String getId()

获取 Session 的 Session ID

2)boolean isNew()

判断该 Session 是否是新创建的(判断用户是否是第一次访问服务器)

3)void invalidate()

使当前对象的session失效(退出登陆,注销时)

4)void setMaxInactiveInterval(int second)int getMaxInactiveInterval()

设置和获取该 Session 对象的最大有效 非活动时间(单位秒)

5)long getCreationTime()

获取该 Session 对象被创建的时间

6)long getCreationTime()

返回该 Session 对象最后活跃时间

7)Enumeration getAttributeNames()

获取该 Session 对象的所有属性名

8)setAttribute(String name,Object obj)getAttribute(String name)removeAttribute(String name)

设置和获取,删除 Session 对象

Session应用

1)获取、使用 Session:

//获取
HttpSession httpSession = request.getSession();  //得到服务端创建的Session对象
//设置Session属性
httpSession.setAttribute("name","记得点赞哦!");   //设置Session对象中属性名为name的值
//获取Session对象中指定属性名的值
HttpSession httpSession = request.getSession();
String value = (String)httpSession.getAttribute("name");  //获取属性名为name的属性值

:Session 对象中的属性是 name-value 即 String-Object 的键值对,所以获取到某属性的属性值时需要进行类型转换。

Cookie 和 Session 的区别

1)从存储内容:

  • Cookie:只能存储字符串,而且存储中文字符时需要对其编码

  • Session:可以存储任何类型的数据(Object)

2)从信息安全:

  • Cookie:Cookie 存储在浏览器中,对客户端是可见的。Cookie 存储的数据容易泄露或丢失

  • Session:Session 存储在服务器上,对客户端是透明不可见的。不存在敏感信息泄露丢失问题,安全性较高

3)从有效期:

  • Cookie:Cookie 存放在本地硬盘中,通过 maxAge 属性设置有效时间;只要有效期未过,即使关闭浏览器 Cookie 依旧有效存在

  • Session:Session 保存在服务器中,通过设置 maxInactiveInterval 属性确定 Session 的有效时间,并且 Session 依赖于名为 JSESSIONID 的 Cookie,该 Cookie 的默认 maxAge 属性值为 -1,即若关闭浏览器,Cookie 便销毁了,对应的 Session 虽然没有从服务器中销毁,但也失效了

4)从对服务器的压力:

  • Cookie:Cookie 保存在客户端,不占用服务器资源

  • Session:Session 保存在服务器,每个用户都会产生一个 Session ,过多的 Session 会消耗大量的内存,需要序列化(持久化,钝化)

5)从浏览器的支持:

  • Cookie:如果浏览器禁用了 Cookie,那么 Cookie 是无效的

  • Session:如果浏览器禁用了 Cookie,Session 可以通过 URI 地址重写来进行会话跟踪
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值