Cookie与session的机制
1.会话的解释
什么是会话?
具体点说就是有A,B两个用户,都在超市购买商品,但是A商品只能将商品放入A的购物车,A与B就是两个会话,但是由于HTTP的协议的特点是无状态的协议,一旦数据交换完毕之后就会将服务端与客户端之间的联系断开,就是说如果A购买完一件商品放入自己的购物车之后,再想去买一件商品的话,服务器就不知道这个购买的行为是谁来请求的,所以出现了一种机制,来跟踪这一次的会话,这种机制之一就是Cookie的机制
2.Cookie的介绍
2.1 Cookie的简单介绍
Cookie 其实就是一种会话跟踪的技术,它是用来在客户端来确定用户的身份的Cookie就是将多个请求之间的联系记录下来,并将请求记录在浏览器上,可以实现请求之间的属性的值(状态)共享。
2.2HTTP协议的特点
HTTP协议特点就是请求之间的状态是独立的,不会记录两个请求之间的状态,又可以称之为无状态
应用场景的举例:
用户的登录的操作
2.3创建一个Cookie
一般的格式为:
Cookie cookie=new Cookie(“名字”,“值”);
设置一个Cookie的寿命
cookie.setMaxage(时间(单位为秒));
通过响应的对象来将Cookie返回给浏览器
方法
response.addCookie();
浏览器每次请求时,会将这个域名进行检查,将这个域名下所有的Cookie全部发送给服务器
Cookie的不可跨域名性:每个浏览器会使用自己的Cookie而不能使用其他浏览器的Cookie
2.4获取一个请求的所有的Cookie
Cookie[]cookies=request.getCookies();
2.5中文乱码的问题
URLEncoder.encode(“汉字”, “utf-8”);//这是将汉字进行编码之后,再将其存入Cookie里面去
URLDecoder.decode(“编码后的内容”, “utf-8”); // 把编码后的内容进行解码
2.6 el表达式来获取Cookie的值
一般的格式为
${cookie.cookie的名称.value}
2.7 Cookie的限制
一个浏览器的域名之下一般可以存入30~50个Cookie
每一个Cookie的大小为4k左右
注意Cookie是存储在浏览器中的,一般重要的信息是不会存储在Cookie中的
3.session的机制
3.1session的概述
session机制的是服务器端的来记录客户端状态的一种的机制,相应的也会增加了服务器端的压力
session机制,是将客户端的状态信息以某种形式存储在服务器端口,只要客户端再次访问的时候,就会在session中获取
3.2session的创建
创建session的一般的格式
HttpSession session=req.getSession();//第一次使用的时候,是先创建一个Session,后续调用的时候只会使用先创建好Session
session.setAttribute(“变量名”,“信息”);//将信息放入session的对象之中
获取session的内容
Object 变量session.getAttribute(“变量名”);
删除一个Session的内容
Object 信息session.removeAtrribute(“变量名”);
让session的对象全部消失
session.invalidate();
典型的应用就是
用户的注册和安全退出
3.3 jsp网页session的获取
${sessionScope.变量名}
3.4session的实现的原理
session的对应的是同一个浏览器
每个客户端访问服务器的时候,服务器会产生为它们创建一个独立的session
session实现的原理
(1)第一次创建session的时候,会产生一个名字JSESSIONID=session的唯一标识
特殊的Cookie
这个JSESSIONID=1
就会随着响应返回给浏览器
(2)之后的每次浏览器的访问都会将Cookie发送给服务器,服务器会根据这个Cookie找到对应的session
(3)jsessionid 这个cookie属于会话cookie,浏览器关闭就会消失
3.5session与Cookie的区别
(1)存储的位置的不同 session是将信息存储于服务器端,Cookie是将信息存储于浏览器端
(2)session与Cookie相比更加的安全
(3)存活的时间不同
session如果长时间不用的话就会被服务器销毁
Cookie只会在浏览器关闭或者是设置的寿命到期的话才会销毁
(4)存储信息的大小不同
Cookie存储的信息大小为4K左右
session的大小理论上是没有限制的但是session的位置是在服务器中的,所以还是不宜存储过多的信息
(5)Cookie存储的信息为字符串,但是session可以存储的信息为任意类型
重定向的请求
区别:
1) 请求转发时,地址栏不会改变(是第一个servlet的地址)
重定向,地址栏会发生变化(是最后一个servlet的地址)
2) 请求转发时一次请求,跳转发生在服务器内部
重定向是两次请求,第一次请求会返回302的状态码和目标地址,
浏览器根据目标地址发送第二次请求,才完成整个流程
3) 重定向是两次请求,所以不能利用request作用域存值取值
但可以使用session作用域来存值取值
请求转发因为是同一次请求,所以可以使用request作用域存值取值
4) 请求转发的目标只能是本项目的servlet或jsp
重定向跳转的目标可以是任意的
查询
servlet --> jsp // 关系密切的跳转使用请求转发 forward()
删除
删除servlet --> 查询列表servlet // 关系不密切的跳转使用重定向 redirect()