首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

初学Java Web(5)——cookie-session学习

HTTP 协议

Web 浏览器Web 服务器之间的一问一答的交互过程必须遵守一定的规则,这样的规则就是HTTP 协议。HTTPhypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP 协议之上的一个应用层的协议,用于定义 Web 浏览器与 Web 服务器之间交互数据的过程以及数据本身的格式。

特点:无状态,默认端口 80

HTTP 协议到底约束了什么?

约束了浏览器以何种格式向服务端发送数据

约束了服务器应该以何种格式接收客户端发送的数据

约束了服务器应该以何种格式反馈数据给浏览器

约束了浏览器应该以何种格式接收服务器的反馈数据

总结:

浏览器给服务器发送数据:一次请求服务器给浏览器反馈数据:一次响应HTTP 无状态协议

HTTP是一个无状态的协议,也就是没有记忆力,这意味着每一次的请求都是独立的,缺少状态意味着如果后续处理需要前面的信息,则它必须要重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就很快。HTTP的这种特性有优点也有缺点:

优点:解放了服务器,每一次的请求“点到为止”,不会造成不必要的连接占用。

缺点:每次请求会传输大量重复的内容信息,并且,在请求之间无法实现数据的共享。

主要问题:请求之间无法实现数据的共享

解决方案:

1.使用参数传递机制:将参数拼接在请求的 URL 后面,实现数据的传递(GET方式),例如:问题:可以解决数据共享的问题,但是这种方式一不安全,二数据允许传输量只有1kb2.使用Cookie技术3.使用Session技术

Cookie 技术

特点:客户端的技术,将共享数据保存在客户端(浏览器)中

英文直接翻译过来就是小甜品,Cookie 的作用呢,通俗的说就是当一个用户通过HTTP访问一个服务器时,这个服务器会将一些Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据又被完整地带回给服务器。这个作用就像是你去超市购物时,第一次给你办了一张购物卡,在这个购物卡里存放了一些你的个人信息,下次你再来这个超市的时候,你就只需要带上你的购物卡,直接购物就好了。

Cookie 操作

创建 Cookie 对象,设置共享数据

Cookiec=newCookie(Stringname,Stringvalue);// 相当于办卡

注意:一个Cookie只能存储一个字符串类型的数据,不能存储其他类型的数据

将 Cookie 响应给浏览器

response对象.addCookie(cookie对象)// 相当于把卡交给用户

获取请求中的 Cookie 信息

Cookie[]cs=request对象.getCookies();for(Cookiec:cs){if(“username”.equals(c.getName())){Stringvalue=c.getValue();}}

修改 Cookie 中的共享数据

重新创建一个新的 Cookie,名称要和要修改的数据一致

现获取到要修改的 Cookie 对象,再调用重新设置

注意:修改 Cookie 中的数据,需要再次发送给浏览器(第2点)

操作 Cookie 的生命周期expiry > 0:设置 Cookie 对象能够存活 expiry 秒,即使关闭浏览器,也不影响 Cookie 中的共享数据,比如设置一个月:expiry = 0:立即删除当前的 Cookie 信息expiry 关闭浏览器时销毁

默认:在关闭浏览器的时候销毁 Cookie 对象

语法:

删除 Cookie 中的共享数据通过来实现

Cookie 中的 key 和 value 不支持中文设置 Cookie 时需要对中文字符串进行编码:

Cookiec=newCookie("username",URLEncoder.encode(username,"UTF-8"));

在获取 Cookie 数据的时候再进行解码:

username=URLDecoder.decode(value,"UTF-8");

Cookie 的路径和域范围

Cookie 的路径Cookie 在创建的时候,会根据当前的Servlet的相对路径来设置自己的路径,比如 Servlet 的为/cookie/login,相对路径则为:/cookie/

出现的问题:只有在访问路径为/cookie/下面的资源的时候,才会将该 Cookie 发送到服务器

解决方案:设置 Cookie 的路径:表示当前应用中的所有的资源都能够共享该Cookie信息

域范围:(了解) 在多个应用之间实现数据的共享,那么就需要设置域范围,比如:

语法:

Cookie 的缺陷

Cookie 的作用其实就是一种会话跟踪技术,但存在一些缺陷:

获取 Cookie 信息比较麻烦

Cookie不支持中文

一个 Cookie 只能存储一个字符串类型的数据

Cookie 在浏览器中有大小和数量上的限制(不同浏览器存在不同的限制,例如FireFox一个站点最多存储50个 Cookie ,浏览器最多存储 4097个字大小的 Cookie)

共享数据时保存在浏览器中,容易造成数据的泄露,不安全

最好的解决方案:将数据保存在服务端(session)

Session 技术

Session:会话,从浏览器打开开始,直到浏览器关闭结束,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。Session 也可以称为会话 Cookie

特点:服务端技术,将数据保存在服务器

理解 Session

前面已经介绍了 Cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,则无形增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 就是客户端第一次访问服务器生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NAME 为 JSESIONID 的一个 Cookie。Session 基本操作

获取 Session 对象

request对象.getSession();

和参数为true的一样

request对象.getSession(true);

获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值

request对象.getSession(false);

获取Session对象,如果没有返回null

设置共享数据

Session对象.setAttribute(Stringname,Objectvalue)

注意:Session 可以存储任何类型的数据,比如登陆用户的信息,可以封装到User对象中

修改共享数据重新设置一个同名的共享数据

获取共享数据

Objectvalue=Session对象.getAttribute(Stringname);

删除 Session 中的共享数据

Session对象.removeAttribute(Stringname);

销毁 Session

voidinvalidate()

Session 的超时管理在 Tomcat 服务器中有默认的配置为30分钟,一般不需要去修改

语法:

超时:在访问当前的资源的过程中,不和网页进行任何的交互,超过设定的时间就是超时

Session 扩展

Seesion 中的共享数据的属性名的命名规范:

通常为:XXX_IN_SESSION,例如:

序列化与反序列化:

Session 中存储的对象通常需要实现序列化接口,因为在网络之间传输的数据格式为二进制数据

序列化:将对象转换成二进制数据

反序列化:将二进制数据转换成对象

URL 重写

出现的问题:当浏览器禁用Cookie之后,那么我们的jsessionid就不能在浏览器中保存,那么后面的请求中就不会将 jsessionid 发送到服务器,服务器这面就找不到数据解决方案:

在url后手动的拼接上 jsessionid传递格式如

使用响应对象中的encodeURL(String path)实现 jsessionid 的自动拼接

推荐方式:②

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180527G1EQJI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券