会话技术
在了解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: user=itcast;Path=/;

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

传输过程可用如下图表示:

如上图:Cookie的工作原理可这样描述

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

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

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

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

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

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

2. Cookie 增删查改 (API方法介绍)
(1)增加Cookie

//1:创建一个Cookie对象 ,只能存非中文的字符串
Cookie cookie1 = new Cookie("name", "liutao");
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.setMaxAge(60*60*24*365*100);
Cookie cookie = new Cookie("username", "baoqiang");
/** 1:默认情况下,Cookie的声明周期是从发送Cookie到浏览器结束* 2:如果要对Cookie持久化,必须设置Cookie的存活时间,则Cookie存到硬盘中*   setMaxAge(expiry) 单位是秒* 3:如果持久化了之后,浏览器关闭之后重启可以重新获取*/
cookie.setMaxAge(60*60*24*365*100); //单位是秒
response.addCookie(cookie);

(5)设置Cookie作用域

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

获取不同的作用域下的Cookie

浏览器向客户端访问对应目录下的资源或接口时,会获取到不同的Cookie
客户端请求:

//获取服务端设置有"/day33_01_cookie_session/"的Cookie
localhost:8080/day33_01_cookie_session
//获取服务端设置有"/day33_01_cookie_session/abc"的Cookie
localhost:8080/day33_01_cookie_session/abc

(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);

Session
1. Session概念
除了使用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操作和API(方法介绍)
添加Session

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

获取Session

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

获取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>

另外,通过调用Session的invalidate()方法可以使Session失效。

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功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

5. URL重写
暂无

Cookie和Session
1. Cookie和Session的区别
从存储方式上比较

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

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

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

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

如果浏览器禁用了Cookie,那么Cookie是无用的了!
如果浏览器禁用了Cookie,Session可以通过URL地址重写来进行会话跟踪。
从跨域名上比较

Cookie可以设置domain属性来实现跨域名
Session只在当前的域名内有效,不可夸域名
6、cookie和session主要区别

两者都是保持会话状态的方式
Cookie是把用户的数据写给用户的浏览器
Session技术把用户的数据写到用户独占的session中
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象
session储存在服务器,cookie储存在客户端
session需要一个sessionid来开启,一般储存在cookie中,由容器自行处理
cookie通过来回发送的key-value来保证会话状态,需要在controller中编码实现会话保持
cookie不太安全,密码、卡号等重要信息应储存在session
session会占用服务器资源,考虑性能时,应当使用cookie

参考链接:

1、https://blog.csdn.net/li_li_lin/article/details/80714372

2、https://www.cnblogs.com/tqsh/p/11314764.html

Servlet之Cookie和Session相关推荐

  1. Web页面或app等前端页面之Java Web的JSP、Servlet、Cookie、Session等技术小结

    Java Web学习,掌握JSP.Servlet.Cookie.Session等内容,使用JSTL进行数据展示完成实际应用. 2.3.1 XML基础 XML的用途.语法规则.语义约束.如何解析XML, ...

  2. 动手学servlet(四) cookie和session

    Cookie   cookie是保存在客户端的一个"键值对",用来存储用户的一些信息 cookie的应用: -在电子商务会话中标识用户 -对网站进行定制,比如你经常浏览哪些内容,就 ...

  3. Servlet的Cookie和Session机制

    Servlet Cookies Cookies定义:Cookies是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息. Cookies作用:会话保持,如完成用户的登录与状态保持 Cookie ...

  4. JavaWeb之Servlet:Cookie 和 Session

    会话 现实生活中我们会用手机跟对方对话,拿起手机,拨号,然后对面接听,跟着互相通话,最后会话结束. 这个过程也可以用我们的B/S模式来描述: 打开浏览器->输入地址->发出请求->服 ...

  5. 几个实用的Servlet应用例子-入门、cookie、session及上传文件

      1Servlet可以被认为是服务端的applet,它被WEB服务器加载和执行,前端可以显示页面和获得页面数据,后台可以操纵数据库,能完成JavaBean的很多功能.在这里我较为详细的说说Servl ...

  6. Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器

    重定向 重定向是服务器告诉客户端往指定的路径再次发出请求的指令 执行过程: 当服务器执行重定向方法时会给客户端返回302状态码和一个请求路径,浏览器接收到302后会立即往指定的路径再次发出请求 res ...

  7. Servlet - cookie、session、servletContext概述

    1.cookie 在客户端的小纸条,存储在客户端 一个servlet/jsp设置的cookies能被同一路径下面或者子路径下面的servlet/jsp读到,但子路径设置的cookies父路径读不到. ...

  8. MySQL、JDBC、HTML、CSS、JavaScript、jQuery、tomcat、Http、Servlet、JSP、EL、JSTL、Maven、Cookie、Session(框架第一部分)

    第一章 MySQL 一 .数据库 1.什么是数据库? 所谓的数据库就是指存储和管理数据的仓库 2.数据库有哪些分类? 3.什么是关系型数据库? 底层以二维表的形式保存数据的库就是关系型数据库 stu- ...

  9. Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)

    概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...

最新文章

  1. 乐观准则和最小后悔值怎么算_婚姻危机:结婚后想离婚,你该怎么办?
  2. JavaScript中typeof的用法
  3. 《cloud+》如果百度云飘走了你该怎么办?
  4. Win10开启Administrator超级管理员账户
  5. Avalonia跨平台入门第十三篇之Expander控件
  6. TopFreeTheme精选免费模板【20130703】
  7. 我的内核学习笔记11:linux leds-gpio驱动应用实例
  8. flutter安装教程(win7)
  9. 知识点汇总【一】操作系统三十八问
  10. 实验四 木马的远程控制和清除
  11. 国内App推广N种方法,总有几种适合你
  12. Python 爬取朋友圈最新方法!!(文末赠书)
  13. linux配置防火墙和重启防火墙
  14. 第39章 连续时间信号与系统的S域分析
  15. python PIL进行图像的crop,resize和save
  16. maven 配置 (个人记录向)
  17. springboot整合dubbo设置全局唯一ID进行日志追踪
  18. 如何使用电脑将图片进行压缩?图片压缩软件怎么操作?
  19. java中常见的英语单词
  20. 过滤器(Filter)的作用及使用

热门文章

  1. 2022届秋招,从被拒到上岸 | 谈谈YK菌在2021年的经历与收获
  2. 低密洋房+超高得房率+三面宽“眼镜”户型=终极居住体 滙德里
  3. 一文搞懂Typescript
  4. P1914 小书童——凯撒密码
  5. 文华财经是C语言编程吗,各位大神们,帮我把这指标改下,文华财经里不能用...
  6. 云联惠系统在微商行业的影响力有多大
  7. WordPress爱导航主题 1.1.3 简约大气网站导航源码网址导航源码
  8. 【车间调度】FJSP评价指标
  9. 天刀服务器维护时间,《天涯明月刀》2021年3月10日服务器例行维护公告 服务器例行维护怎么样...
  10. DICOM医学图像格式转换的C++实现 DIOCM转 BMP、读取DICOM图像(转载)