会话控制——Cookie和Session
Cookie简介
l HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。
l Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。
l 例如:我们上文说的网上商城,当用户向购物车中添加一个商品时,服务器会将这个条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存在内存中(注意这里的内存是本机内存,而不是服务器内存),那之后每次向服务器发送请求,浏览器都会携带该Cookie,而服务器就可以通过读取Cookie来判断用户到底买了哪些商品。当用户进行结账操作时,服务器就可以根据Cookie的信息来做结算。
l Cookie的用途:
n 网上商城的购物车
n 保持用户登录状态
l Cookie的原理:
n 总的来看Cookie像是服务器发给浏览器的一张“会员卡”,浏览器每次向服务器发送请求时都会带着这张“会员卡”,当服务器看到这张“会员卡”时就可以识别浏览器的身份。
n 实际上这个所谓的“会员卡”就是服务器发送的一个响应头:
如图Set-Cookie这个响应头就是服务器在向服务器发“会员卡”,这个响应头的名字是Set-Cookie,后边JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E和 Path=/Test_cookie,是两组键值对的结构就是服务器为这个“会员卡”设置的信息。浏览器收到该信息后就会将它保存到内存或硬盘中。
n 当浏览器再次向服务器发送请求时就会携带这个Cookie信息:
这是浏览器发送的请求报文,中间画红框的就是Cookie信息,这里可以理解为浏览器这次带着“会员卡”再次访问服务器。
n 于是服务器就可以根据Cookie信息来判断浏览器的状态。
l Cookie的缺点
n Cookie最为请求或响应报文发送,无形中增加了网络流量。
n Cookie是明文传送的安全性差。
n 各个浏览器对Cookie有限制,使用上有局限
使用Cookie
l 使用Cookie主要是先创建Cookie对象,然后将Cookie信息发送给浏览器,浏览器收到Cookie后会自动保存,然后我们可以在下次浏览器发送请求时读取Cookie信息。
设置Cookie
l 创建一个CookieServlet
l 在Servlet的doPost()方法中编写如下代码:
- //创建一个Cookie对象
- Cookie cookie = new Cookie("username", "zhangsan");
- //将Cookie对象放入response对象中
- response.addCookie(cookie);
l 在浏览器中访问该Servlet,会发现响应头中出现如下内容:
Set-Cookie: username=zhangsan
l 如此就成功的向浏览器设置了一个Cookie,当我们在刷新页面时会发现浏览器的请求头中出现如下代码:
Cookie: username=zhangsan
l 同样我们还可以同时设置多个Cookie:
- //创建一个Cookie对象
- Cookie cookie1 = new Cookie("username", "zhangsan");
- Cookie cookie2 = new Cookie("password", "123456");
- Cookie cookie3 = new Cookie("age", "20");
- //将Cookie对象放入response对象中
- response.addCookie(cookie1);
- response.addCookie(cookie2);
- response.addCookie(cookie3);
l 浏览器会以一下形式发送Cookie:
Cookie: username=zhangsan; password=123456; age=20
l 总之,设置Cookie就是两个步骤:
- 创建Cookie对象
- 将Cookie对象加入到response中
读取Cookie
l 读取Cookie主要指从读取浏览器中携带的Cookie
l 只需要通过一个方法就可以得到浏览器中的Cookie,在Servlet或JSP中通过request对象调用getCookies()方法可以获得浏览器传送过来的所有Cookie对象,返回的是一个Cookie数组,通过遍历Cookie数组可以获得所有的Cookie信息。
l 如:
- //通过request的getCookies()方法获的Cookie数组
- Cookie[] cookies = request.getCookies();
- //判断数组是否为空
- if(cookies != null){
- //如果不为空遍历数组
- for(Cookie cookie : cookies){
- //获取cookie的名字
- String name = cookie.getName();
- //获取cookie的键
- String value = cookie.getValue();
- System.out.println(name+"---"+value);
- }
- }
Cookie有效时间
l 经过上边的介绍我们已经知道Cookie是存储在浏览器中的,但是可想而知一般情况下浏览器不可能永远保存一个Cookie,一来是占用硬盘空间,再来一个Cookie可能只在某一时刻有用没必要长久保存。
l 所以我们还需要为Cookie设置一个有效时间。
l 通过Cookie对象的setMaxAge()可以设置Cookie的有效时间。
l 其中setMaxAge()接收一个int型的参数,来设置有效时间。参数主要有一下四种情况:
n 设置为0,setMaxAge(0)
u Cookie立即失效,下次浏览器发送请求将不会在携带该Cookie
n 设置大于0,setMaxAge(60)
u 表示有效的秒数60就代表60秒即1分钟,也就是Cookie在1分钟后失效。
n 设置小于0,setMaxAge(-1)
u 设置为负数表示当前会话有效。也就是关闭浏览器后Cookie失效
n 不设置
u 如果不设置失效时间,则默认当前会话有效。
Cookie的路径
l Cookie的路径指告诉浏览器访问那些地址时该携带该Cookie,我们知道浏览器会保存很多不同网站的Cookie,比如百度的Cookie,新浪的Cookie,腾讯的Cookie等等。那我们不可能访问百度的时候携带新浪的Cookie,也不可能访问每个网站时都带上所有的Cookie这是不现实的,所以往往我们还需要为Cookie设置一个Path属性,来告诉浏览器何时携带该Cookie。
l 我们同过Cookie的setPath()来设置路径,这个路径是由浏览器来解析的所以/代表服务器的根目录。
l 如:
n 设置为 /项目名/路径 à cookie.setPath(“/项目名/路径”)
u 这样设置只有访问“/项目名/路径”下的的资源才会携带Cookie
u 如:/项目名/路径/1.jsp 、/项目名/路径/hello/2.jsp 等
n 如果不设置,默认会在访问“/项目名”下的资源时携带
u 如:“/项目名/index.jsp” 、 “/项目名/hello/index.jsp”
HttpSession
l 使用Cookie有一个非常大的局限,就是如果Cookie很多,则无形的增加了客户端与服务端的数据传输量。而且由于浏览器对Cookie数量的限制,注定我们不能再Cookie中保存过多的信息,于是Session出现。
l Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。
Session的工作原理
l Session的创建
n Session的创建时机是在request.getSession()方法第一次被调用时。
n Session被创建后,同时还会有一个名为JSESSIONID的Cookie被创建。
n 这个Cookie的默认时效就是当前会话。
l Session的使用
n Session被创建后,对应的Cookie被保存到浏览器中,之后浏览器每次访问项目时都会携带该Cookie。
n 当我们再次调用时会根据该JSESSIONID获取已经存在的Cookie,而不是在创建一个新的Cookie。
n 如果Cookie中有JSESSIONID,但是JSESSIONID没有对应的Session存在,则会重新创建一个HttpSession对象,并重新设置JSESSIONID。
Session时效
l 基本原则
n Session对象在服务器端不能长期保存,它是有时间限制的,超过一定时间没有被访问过的Session对象就应该释放掉,以节约内存。所以Session的有效时间并不是从创建对象开始计时,到指定时间后释放——而是从最后一次被访问开始计时,统计其“空闲”的时间。
l 默认设置
n 在全局web.xml中能够找到如下配置:
- <!-- ==================== Default Session Configuration ================= -->
- <!-- You can set the default session timeout (in minutes) for all newly -->
- <!-- created sessions by modifying the value below. -->
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
说明Session对象默认的最长有效时间为30分钟。
l 手工设置
n session.setMaxInactiveInterval(int seconds)
n session.getMaxInactiveInterval()
l 强制失效
n session.invalidate()
l 可以使Session对象释放的情况
n Session对象空闲时间达到了目标设置的最大值,自动释放
n Session对象被强制失效
n Web应用卸载
n 服务器进程停止
URL重写
l 在整个会话控制技术体系中,保持JSESSIONID的值主要通过Cookie实现。但Cookie在浏览器端可能会被禁用,所以我们还需要一些备用的技术手段,例如:URL重写。
l URL重写其实就是将JSESSIONID的值以固定格式附着在URL地址后面,以实现保持JSESSIONID,进而保持会话状态。这个固定格式是:URL;jsessionid=xxxxxxxxx
l 例如:
targetServlet;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957 |
l 实现方式:
n response.encodeURL(String)
n response.encodeRedirectURL(String)
n 例如:
- //1.获取Session对象
- HttpSession session = request.getSession();
- //2.创建目标URL地址字符串
- String url = "targetServlet";
- //3.在目标URL地址字符串后面附加JSESSIONID的值
- url = response.encodeURL(url);
- //4.重定向到目标资源
- response.sendRedirect(url);
Session的活化和钝化
l Session机制很好的解决了Cookie的不足,但是当访问应用的用户很多时,服务器上就会创建非常多的Session对象,如果不对这些Session对象进行处理,那么在Session失效之前,这些Session一直都会在服务器的内存中存在。那么就,就出现了Session活化和钝化的机制。
l Session钝化:Session在一段时间内没有被使用时,会将当前存在的Session对象序列化到磁盘上,而不再占用内存空间。
l Session活化:Session被钝化后,服务器再次调用Session对象时,将Session对象由磁盘中加载到内存中使用。
如果希望Session域中的对象也能够随Session钝化过程一起序列化到磁盘上,则对象的实现类也必须实现java.io.Serializable接口。不仅如此,如果对象中还包含其他对象的引用,则被关联的对象也必须支持序列化,否则会抛出异常:java.io.NotSerializableException
会话控制——Cookie和Session的更多相关文章
- http协议。会话控制cookie、session
http协议是无状态的协议.每次访问页面的http协议都是独立的,正是因为http协议是无状态的,所以导致访问一个页面后再去访问另一个页面的时候,一些数据会消失,比如:用户的登录信息就会消失.那么怎么 ...
- 会话控制:Cookie和session
HTTP(超文本传输协议)定义了通过万维网(WWW)传输文本.图形.视频和所有其他数据所有的规则.HTTP是一种无状态的协议,说明每次请求的处理都与之前或之后的请求无关.虽然这种简化实现对于HTTP的 ...
- 会话控制cookie和session
Cookie Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时, ...
- 会话技术: Cookie 和 Session
会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...
- 会话技术cookie和session详解
什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一 ...
- PHP-会话控制Cookie和Session
会话控制:就是为了我们在访问页面和页面之间的跳转是,能够识别到你的登录状态,已经你的登录时长等 在php的会话控制当中,涉及到两个概念Cookie和Session Cookie 会话控制 原理:在登录 ...
- 会话管理---Cookie与Session
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 保存会话数据的两种技术:Cookie,Session Cookie是客户端技术, ...
- 会话跟踪Cookie与Session
会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie.Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie 1.1概念及使 ...
- Servlet 会话技术cookie和session
会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...
随机推荐
- uniGUI之uniColorButton(21)
uniColorButton相当于VCL的ColorDialog1 若Palette 为空,则为系统自带颜色.
- 5款微信小程序开发工具使用报告,微信官方开发工具还有待提升
微信小程序已经内测有一段时间了,笔者本着好奇加学习的心态写了几个小demo,虽然在MINA框架上并没有遇到太多的坑,但官方开发工具实在不敢恭维. api提示不全,要一个个查api啊,写代码超级慢啊 很 ...
- System.Diagnostics.Conditional 的妙用 -- 把文档放在代码中
最近的工作跟 UI 打交道比较多, 各种坑. 今天从 Prefab 的序列化功能来说说 System.Diagnostics.Conditional 的妙用. 我们做 UI 面对各种按钮, 组件的获取 ...
- Xcode下载途径
Xcode除了能在Appstore直接下载外,还可以用开发者账号登陆开发者中心[https://developer.apple.com/download/]下载对应的资源. 在开发者中心下载的好处是, ...
- 吴裕雄--天生自然python机器学习实战:K-NN算法约会网站好友喜好预测以及手写数字预测分类实验
实验设备与软件环境 硬件环境:内存ddr3 4G及以上的x86架构主机一部 系统环境:windows 软件环境:Anaconda2(64位),python3.5,jupyter 内核版本:window ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:复选框(Checkbox)和单选框(Radio)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- day07 集合
''' list,查询过程中修改,会报错,类似java的并发修改异常 Traceback (most recent call last): File "C:/1xubenqing/pytho ...
- Date.parse在IE/Firefox下有兼容性问题
原因: IE和Firefox是不支持含有'-'字符的日期格式,如:"2018-11-23" 解决方法: 日期格式 'yyyy-mm-dd' 改成 'yyyy/mm/dd' 代码: ...
- [Tommas] ERP系统测试用例设计1(转)
问题: 1.如何进行ERP系统测试用例设计? 2.ERP系统测试用例设计过程? 3.ERP系统测试用例设计的方法? ERP系统本身是一种业务流程很复杂,单据报表众多,逻辑性很强的系统,质量保证方面很难 ...
- Linux CentOS7 VMware克隆、虚拟机之间互连——初学笔记
一.VMware克隆:选中我的第一个虚拟机,右键下拉菜单—管理—克隆. 弹出对话框,下一步根据提示: 完成克隆: 二.虚拟机互连: 配置第二虚拟机IP,使用:vi /etc/s ...