day10_cookie&session学习笔记
一、会话概述
1、什么是会话?如同打电话。
2、会话过程要解决的问题是什么?保持各个客户端自己的数据。
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。
思考:用户购买的商品保存在request或servletContext中行不行?答:不行。
保存会话数据的两种技术 :
Cookie:是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。
当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。
这样,web资源处理的就是用户各自的数据了。
HttpSession:Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,
当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
二、Cookie(饼干/小甜饼)
由于Cookie数据是由客户端来保存和携带的,所以称之为客户端技术。

javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应消息头中增加一个相应的Set-Cookie头字段。
同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。
1、属性:
name:该名称不能唯一确定一个Cookie。路径可能不同。
value:不能存中文。
path:默认值是写Cookie的那个程序的访问路径。
比如:http://localhost:8080/day10_00_cookie/servlet/ck1写的Cookie
path就是:/day10_00_cookie/servlet 即看当前创建cookie的资源(servlet)文件路径。
客户端在访问服务器另外资源时,根据访问的路径来决定是否带着Cookie到服务器。
如果当前访问的路径是以cookie的path开头的路径(包括在该路径下的子路径),浏览器就带Cookie。否则不带Cookie。
maxAge:cookie的缓存时间。默认是-1,-1指示该cookie将保留到浏览器关闭为止。(默认存在浏览器的缓存中)。单位是秒。
负数:表示cookie的数据存在浏览器缓存中。
0:表示删除。注意:路径要保持一致,否则可能删错人。
正数:表示缓存(持久化到磁盘上)的时间。单位是秒。
2、方法:
public Cookie(String name, String value) 构造方法(只有一个)
setValue与getValue方法
setMaxAge与getMaxAge方法(单位为秒)
setPath与getPath方法
setDomain与getDomain方法
getName方法
3、补充知识点:
面试题:Servlet负责那些事情?
1. 获取表单数据
2. 处理业务逻辑
3. 分发转向
案例:
1. 客户端记住用户名

2. 显示用户上次浏览过的商品

三、HttpSession(会话)
1、为什么要学HttpSession?
> 它也是一个域对象: servletContext(不同浏览器) > session(同一浏览器的多个会话) > request(一个会话)
> 同一个会话下,可以使一个应用的多个资源共享数据。
> cookie是客户端技术,只能存字符串,不安全,存储少量信息,不适合存储敏感信息。HttpSession是服务器端的技术,它可以存对象。
2、常用方法
把数据保存在HttpSession对象中,该对象也是一个域对象。
void setAttribute(String name, Object value) 使用指定名称将对象绑定到此会话。如果具有同样名称的对象已经绑定到该会话,则替换该对象。
Object getAttribute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null。
void removeAttribute(String name) 从此会话中移除与指定名称绑定在一起的对象。如果会话没有与指定名称绑定在一起的对象,则此方法不执行任何操作。
String getId() 返回包含分配给此会话的唯一标识符的字符串。标识符是由 servlet 容器分配的,并且是与实现相关的。
setMaxInactiveInterval(int interval) 设置session的存活时间(默认存活时间是30分钟)
void invalidate() 使此会话无效(退出网站时调用)
3、getSession():内部执行原理
HttpSession request.getSession():内部执行原理
1、获取名称为JSESSIONID的Cookie的值。例如:Cookie: JSESSIONID=070BB766FAB03E03DBF28F8040CA616F
2、如果没有这样的Cookie,服务器则创建一个新的HttpSession对象,并分配一个唯一的SessionID,并且向客户端写了一个名字为JSESSIONID=sessionID的Cookie。
3、如果有这样的Cookie,服务器则获取Cookie的值(即HttpSession对象的值),从服务器的内存中根据ID找那个HttpSession对象:
找到了:取出继续为你服务。
找不到:从2开始,创建一个新的HttpSession对象。
HttpSession request.getSession(boolean create):返回与此请求关联的当前 HttpSession,如果没有当前会话并且 create 为 true,则返回一个新会话。
参数:
true:和getSession()功能一样。
false:根据客户端JSESSIONID的Cookie的值,找对应的HttpSession对象,找不到返回null(但不会创建新的,只是查询)。

4、客户端禁用Cookie后的会话数据保存问题
客户端禁用Cookie:浏览器永远不会向服务器发送Cookie的请求消息头。
解决方案:
方案一:在主页上给出提示:请不要禁用您的Cookie。
方案二:URL重写。必须对网站的所有地址都重写。
http://url ---> http://url;JSESSIONID=070BB766FAB03E03DBF28F8040CA616F
response.encodeURL(String url);
看浏览器有没有发送Cookie请求消息头,没有就重写URL,有就不重写。
request.getSession(); // 必须写,虽然没接收
day10_cookie&session学习笔记的更多相关文章
- 18、cookies与session学习笔记
本文记录学习 cookies 和 session 的一些小练习和知识点 知识点1 cookies 和 session 的由来 HTTP协议是无状态的协议,因为一旦浏览器和服务器之间的请求 ...
- php session学习笔记(实例代码)
http 无状态协议 一个服务器向客户端发送消息的时候有三条信息 一是状态二是头信息三是内容 会话控制 让一个用户访问每个页面,服务器都知道是哪个用户访问 cookie cookie是通过头信息发送 ...
- Tensorflow学习笔记2:About Session, Graph, Operation and Tensor
简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节 ...
- [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- 【一天一道LeetCode】#104. Maximum Depth of Binary Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...
- 读书笔记 - reword (重来)
reword (重来) 虽然我是一个不是很喜欢看书的人,但是公认的是看书对提高个人的水平是很有帮助的. 而且我想,如果我要写一本书,我一定会经过多次校验.经过长时间思考确保无误后才会出版的.所以我想看 ...
- “XcodeGhost”病毒之后,苹果更应注…
虽然大家都在期待中秋假期的到来,不过让开发者挺闹心的一件事就是这几天网上.朋友圈以及各种群中炒得沸沸扬扬的"XcodeGhost"病毒事件,就连央视也惊动了!! 事件起源 事件起源 ...
- 谈谈Ext JS的组件——容器与布局
概述 在页面中,比较棘手的地方就是布局.而要实现布局,就得有能维护布局的容器.可以说,在我试过和使用过的Javascript框架中,Ext JS的布局是做得最棒的一个,而这得益于它强大的容器类和丰富的 ...
- unity 快速创建小地图
先写一个纹理遮罩shader Shader "Unlit/TexMask" { Properties { _MainTex ("Texture", 2D) = ...
- of这个变态
英式口语还能听懂,一到美式,连读,爆破,就让人疯掉. 尤其big bang theory, of就是个变态,其读法有,英[əv, əv, v, f] 美[əv, ɑv,əv].但大部分都是/əv/. ...
- Swift基础之UITextField
//设置全局变量,将下面的替换即可 //var myTextField = UITextField(); //系统生成的viewDidLoad()方法 override fun ...
- android驱动例子(LED灯控制)
本例子,讲述在android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导 要达到的效果:通过a ...
- Android使用Canvas实现跑马灯
网上的很多的教程都是通过更改TextView的属性进行跑马灯的设计.这样做有很多的缺点: 1.如果TextView没有获取焦点,那么跑马灯的效果无法实现. 2.如果文本长度小于TextView的宽度, ...
- 《java入门第一季》之面向对象面试题(this和super的区别)
this和super的区别? 分别是什么呢? this代表本类对象的引用. super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员) 怎么用呢? A:调用成员变量 this.成员变量 ...