会话技术
在了解cookie和session之前,需要先了解一个概念:会话

1. 概念
在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。web应用中的会话过程类似于生活中的打电话过程,它指的是客户端(浏览器)与web服务器之间连续发生的一系列请求和响应的过程。例如:一个用户在某个网站上的整个购物过程就是一个会话。

2. HttpServletRequest对象和ServletContext
HttpServletRequest对象和ServletContext都可以对数据进行保存,但是针对下面所描述的需求就不可行:

用户甲和乙分别登录购物网站,甲在购物车中添加了一个iphone手机,乙在购物车中添加了一个Ipad平板,这时web服务器需要对用户甲和用户乙的信息分别进行保存。

HttpServletRequest对象存储为什么不能实现该需求呢?

客户端请求web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买的数据会丢失。

ServletContext对象为什么不能实现改需求呢

使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中的所有用户购买的商品进行结算,这显然也是不行的。

Cookie和Session

为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。

3. 会话跟踪
 Cookie
1.概念
        当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息会保存在Cookie中。这样,当浏览器再次访问服务器时,会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。 
        服务器向客户端发送Cookie时,会在HTTP响应头中增加Set-Cookie响应头信息。Set-Cookie头字段中设置的Cookie遵循一定的语法格式,具体如下:
Set-cookie: color=red;Path=/;

在上述事例中:color表示Cookie的名称,red表示Cookie的值,Path表示Cookie的属性。 
注意:Cookie必须以键值对的形式存在,其属性可以有多个,但这些属性之间必须用分号;和空格分隔。

2.Cookie的工作原理可这样描述

1)首先浏览器向服务器发出请求。

2)服务器就会根据需要生成一个Cookie对象,并且把数据保存在该对象内。

3)然后把该Cookie对象放在响应头,一并发送回浏览器。

4)浏览器接收服务器响应后,提出该Cookie保存在浏览器端。

5)当下一次浏览器再次访问那个服务器,就会把这个Cookie放在请求头内一并发给服务器。

6 )  服务器从请求头提取出该Cookie,判别里面的数据,然后作出相应的动作。

 3.Cookie 的增删改查

(1)增加Cookie

//1:创建一个Cookie对象 ,只能存非中文的字符串
Cookie cookie1 = new Cookie("name", "zhangsan");
Cookie cookie2 = new Cookie("age", "35");
//2:将生成的Cookie发送到浏览器response.addCookie(cookie1);response.addCookie(cookie2);

(2)获取Cookie

Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {System.out.println(cookie.getName()+" " + cookie.getValue());
}

(3)设置Cookie中文:URLEncoder(编码),URLDecoder(解码)

  • URLEncoder.encode(“张三”, “UTF-8”);//编码
  • URLDecoder.decode(cookie.getValue(), “UTF-8”);//解码

添加Cookie

//对中文进行编码
String str = URLEncoder.encode("张三", "UTF-8");
Cookie cookie = new Cookie("username", str); //"%ED%AC%11%FE" URL编码
response.addCookie(cookie);

获取Cookie

Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {//对中文进行解码String str = URLDecoder.decode(cookie.getValue(), "UTF-8");System.out.println(cookie.getName()+" " + str);
}

(4)设置Cookie持久化时间

Cookie cookie = new Cookie("username", "lisi");
/** 1:默认情况下,Cookie的声明周期是从发送Cookie到浏览器结束* 2:如果要对Cookie持久化,必须设置Cookie的存活时间,则Cookie存到硬盘中*   setMaxAge(expiry) 单位是秒* 3:如果持久化了之后,浏览器关闭之后重启可以重新获取*/
cookie.setMaxAge(60*60*24*365*100); //单位是秒
response.addCookie(cookie);

(5)设置Cookie作用域

Cookie cookie = new Cookie("username", "wangwu");
//设置Cookie访问路径:path//1:只要访问同一个Tomcat中所有的项目资源,都会携带Cookie
cookie.setPath("/");
//2:只要访问我当前项目中的所有资源,都会携带Cookie1
cookie.setPath("/AiTest/");
//3:只要访问我当前项目中的abc目录下所有资源,都会携带Cookie
cookie.setPath("/AiTest/abc");//cookie.setPath(request.getContextPath());
response.addCookie(cookie);

(6)删除Cookie

//清除Cookie
Cookie cookie = new Cookie("username", "");
//1:设置访问的路径path,  这里的Path必须和设置Cookie 的路径保持一致
cookie.setPath(request.getContextPath());
//2:设置存活时间
cookie.setMaxAge(0);
//3:将cookie发送到浏览器
response.addCookie(cookie);
//删除cookie就是将指定cookie存活时间设置为0让浏览器删除

Session

1.概念

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。 
注意:由于客户端需要接受、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。 
过程如下:

那么Session技术的原理是什么,它是如何工作的呢?

1)浏览器发出请求到服务器。 
2)服务器会根据需求生成Session对象,并且给这个Session对象一个编号,一个编号对应一个Session对象 
3)服务器把需要记录的数据封装到这个Session对象里,然后把这个Session对象保存下来。 
4)服务器把这个Session对象的编号放到一个Cookie里,随着响应发送给浏览器 
5)浏览器接收到这个cookie就会保存下来 
6)当下一次浏览器再次请求该服务器服务,就会发送该Cookie 
7)服务器得到这个Cookie,取出它的内容,它的内容就是一个Session的编号!!! 
8)凭借这个Session编号找到对应的Session对象,然后利用该Session对象把保存的数据取出来!

2.Session的增删改查

( 1 )添加Session

//1: 创建Session对象,并设置值
HttpSession session = request.getSession(); //服务器上map集合
session.setAttribute("username", "zhagnsan");

( 2 )获取Session

//获取Session
HttpSession session = request.getSession();
Object username = session.getAttribute("username");
System.out.println("username:"+username);

( 3 )删除Session

HttpSession session = request.getSession();
//1.将指定session的value设置为null
session.setAttribute("user",null);
//2.移除指定key的session
session.removeAttribute("username");
//3.销毁当前session
session.invalidate();

( 4 )获取Session编号ID

String id = session.getId(); //获取Session的编号Id
 

3.Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。

4.Session的有效期
由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也可以在Tomcat的config目录下的web.xml中修改。

<session-config><session-timeout>30</session-timeout>
</session-config>

5.Session对浏览器的要求

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

Cookie和Session的区别

从存储方式上比较

Cookie只能存储字符串,如果要存储非ASCII字符串还要对其编码; Session可以存储任何类型的数据,可以把Session看成是一个容器
cookie数据存放在客户的浏览器上,session数据放在服务器上;
单个cookie在客户端的限制是4K,就是说一个站点在客户端存放的COOKIE不能超过4K(不同浏览器不同);

从隐私安全上比较

Cookie存储在浏览器中,对客户端是可见的。信息容易泄露出去。如果使用Cookie,最好将Cookie加密
Session存储在服务器上,对客户端是透明的。不存在敏感信息泄露问题。

从有效期上比较

Cookie保存在硬盘中,只需要设置maxAge属性为比较大的正整数,即使关闭浏览器,Cookie还是存在的
Session的保存在服务器中,设置maxInactiveInterval属性值来确定Session的有效期。并且Session依赖于名为JSESSIONID的Cookie,该Cookie默认的maxAge属性为-1。如果关闭了浏览器,该Session虽然没有从服务器中消亡,但也就失效了。

从对服务器的负担比较

Session是保存在服务器的,每个用户都会产生一个Session,如果是并发访问的用户非常多,是不能使用Session的,Session会消耗大量的内存。
Cookie是保存在客户端的。不占用服务器的资源。像baidu这样的大型网站,一般都是使用Cookie来进行会话跟踪。

javaWeb之Cookie和Session相关推荐

  1. JavaWeb(七)——Cookie、Session

    文章目录 1. 会话 2. 保存会话的两种技术 3. Cookie 4. Session(重点) 1. 会话 会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称 ...

  2. JavaWeb之Cookie,Session

    目录 一.Cookie 1.1概念 1.2快速入门 1.3Cookie细节 1.3.1 一次可不可以发送多个cookie? 1.3.2 cookie在浏览器中保存多长时间? 1.3.3 cookie能 ...

  3. (JavaWeb)会话跟踪技术Cookie和Session(重点)

    文章目录 Cookie和Session 会话 保存会话的两种技术 Cookie 实现显示上次访问时间 Session Session的使用 session实现购物车功能 Cookie和Session ...

  4. JavaWeb 入门篇 (5) Cookie 和 Session 详解

    Cookie 和 Session 详解 一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过 ...

  5. javaweb入门笔记(5)-cookie和session

    2019独角兽企业重金招聘Python工程师标准>>> javaweb入门笔记(5)-cookie和session 标签: javaweb [TOC] Cookie是客户端技术:Se ...

  6. JavaWeb(二):Cookie、Session、JSP、过滤器和监听器、JDBC

    JavaWeb-2 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV12J411M7Sj 学习资料笔记:CSDN – https://blog.c ...

  7. ajax获取session值_【JavaWeb】91:Cookie与Session

    今天是刘小爱自学Java的第91天. 感谢你的观看,谢谢你. 话不多说,开始今天的学习: 学cookie之前,我先说一个问题: 如果我设置浏览器不保存cookie. 会发现很多网站都没法登录了. 购物 ...

  8. javaweb:会话管理和保存会话数据的两种技术(Cookie、Session)

    会话: •会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话过程中要解决的一些问题? •每个用户与服务器进行交互的过程中,各自 ...

  9. JavaWeb学习笔记(狂神版)--- 第九节 Cookie与Session

    第九节 Cookie与Session 目录 第九节 Cookie与Session 9.1 会话 9.2 Cookie 9.3 Session 9.1 会话 会话:用户打开一个浏览器,点了很多超链接,访 ...

最新文章

  1. 北京自动驾驶提速:华为奥迪图森完成高速测试,百度包揽全部40张载人牌照...
  2. 当在做产品规划时,我们应该干什么 | PMcaff-产品
  3. sscanf fscanf函数格式化输入遇到\n问题
  4. 框架生成的HTML修改,Django框架form表单验证 修改html标签的样式
  5. reactJS -- 9 组件的Refs(操作DOM的两种方法)
  6. C++ 流操作符重载函数
  7. 安装 VMware Workstation Pro 16 并创建 ubuntu 20.04 虚拟机
  8. 【数据库】一篇文章搞懂数据库隔离级别那些事(LBCC,MVCC)
  9. Overleaf 显示中文
  10. JavaScript字符串替换replace方法
  11. java匿名类_Java匿名类
  12. 开课吧:人工智能是后互联时代的发展路径和方向
  13. 四川农大2020计算机专业录取分数线,四川农业大学2020年在全国各省市分专业录取分数线!含艺体类!...
  14. mac修改文件的默认打开方式
  15. 一个很好的弹出层插件nyroModal
  16. C++学习笔记(达内视频版)
  17. cocos2dx-lua 骨骼动画spine使用心得(cocos2dx版本 3.17 spine版本3.6.53)
  18. 计算机量子化学计算焓,第一章、量子化学积分一——Slater函数
  19. 神经网络训练的一些方法
  20. Mybatis Plus 3 oracle 自增序列

热门文章

  1. 网页上编辑的内容因为网页误关被删了,怎么恢复
  2. ground truth 到底是什么意思???
  3. Linux访问Windows7共享文件夹
  4. 一例较成功的国产PHP问卷调查系统
  5. 2020年G3(电站锅炉)考试题及G3(电站锅炉)考试报名
  6. android屏幕广播软件,广西视听app下载 广西视听(广西广播电视台手机客户端) for Android v2.2.0 安卓手机版 下载-脚本之家...
  7. medium hosts
  8. 联想文件服务器推荐配置,联想DS系列存储配置文档(非IBM DS系列)
  9. iOS利用系统分享实现分享视频功能
  10. CSS浮动--慕课网