cookie
作用
就是用来保存浏览器会话过程中产生的数据,比如我们在网页上登录,下次打开该网页,发现会有提示我们之前输入过的信息,这便用到cookie
保存数据的原理
这里先模拟一个浏览器手机号登录功能,下次打开浏览器登录会发现,输入框会提示我们之前输入的手机号
Cookie是一种key=value形式的字符串,定义了一些HTTP请求头和HTTP响应头,基于两个头Set-Cookie响应头和Cookie请求头进行工作,通过这些HTTP头信息使服务器可以与客户进行状态交互。
客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。
cookie生存周期
cookie会保存在浏览器的内存中,默认关闭浏览器,cookie会消失,可以通过setMaxAge(秒数);
如果这个秒数小于或者等于0,那同样会销毁,因为cookie没有销毁的方法,
如果设置为0,就立即销毁,无论浏览器关闭不关闭;
如果大于0,那么cookie会以文件的形式保存在浏览器的临时文件夹下,此时关闭浏览器,cookie也不会销毁
cookie存储中文
http协议规定中文不能直接传输,会通过url编码进行传输,服务器在通过url解码
Cookie cookie=new Cookie("prod", URLEncoder.encode(phonesString,"utf-8"));
prodsString=URLDecoder.decode(cookie.getValue(),"utf-8");
- 每一个web应用的cookie最好不超过20/30/50个,每一个cookie不超过1k,实现记录用户名,上次的访问时间等等;
Session
同一个浏览器访问同一个web应用,session只会创建一次
session也是域对象,我们知道域对象具有一个可以访问的map集合,并且具有访问范围,通过该对象的map集合可以在当前范围内实现数据共享。session对象也提供了一些方法,比如添加域属性,获取域属性
session的创建
在第一次调用request.getSession方法时创建对象,只创建一次;HttpSession session=request.getSession();
session销毁的两种场景
session默认误操作是30分钟超时,超时销毁;
人为销毁,或者意外销毁,比如断电等
正常关闭服务器,ssession为什么不会销毁?
但是如果服务器正常关闭,session是不会销毁的,假如我们发布了一个web项目,正在运行,此时我们关闭服务器,我们用Tomcat举个例子:
我发布了一个web应用,正在运行
此时我们正常关闭tomcat服务器
![]()
打开目录tomcat8/work/Catalina/localhost/SessionTest,会发现多了一个ser
然后再次启动服务器
打开目录tomcat8/work/Catalina/localhost/SessionTest,会发现ser没有了
当服务器正常关闭,session不会销毁,而是以文件的形式保存在硬盘上,这个过程叫做session的序列化,也叫session的钝化;
当再次启动时,钝化的session会反序列化,恢复到服务器,也叫session的活化;
session作用范围和功能
在整个会话范围内,实现数据共享
关于session的创建
只要一访问jsp,就会马上创建session对象
假如我们在jsp的根标签下设置不默认创建,可以这样:session="false",即便我们不写,默认为true
<%@ page session="false" language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
那这时候就必须先创建再调用:
<%HttpSession session=request.getSession();
session.setAttribute("phone", "151"); %>
关于session超时时间设置
在web.xml文件的根目录下设置,分钟
<session-config>
<session-timeout>1</session-timeout>
</session-config>
判断session是否存在
request.getSession(false);//这里默认是true,我们手动改成false,如果存在则返回session,否则返回null
销毁session
request.getSession().invalidate();
cookie与session的关系
- session是基于cookie进行工作的,假如好多浏览器访问服务器,那服务器是怎么区分哪个session对应哪个浏览器呢?其实每一个session对象创建之后,服务器都会给session分配一个独一无二的id,这个id会以cookie的形式发送给浏览器保存,这个过程是服务器底层操作的,下一次浏览器请求服务器时候,会把cookie带给服务器,服务器获取session的id,找到对应的session,如果浏览器删除了cookie,即便说session还存在,那么浏览器也没办法把session对应的id通过cookie传给服务器,服务器就没办法根据id找到session,此时服务器就会创建一个新的session。
- 当我从服务器给浏览器传了一个session,在浏览器上查看 JSESSIONID是一个32位16进制数
此时我们再次把session传给服务器,是同一个session,如果销毁,才会变
cookie和session的区别
- cookie存储的数据容易丢失或者被窃取,我们可以直观的看和删除,所以cookie存储数据 不稳定也不安全,所以适合保存安全性不高的数据,适合保存时间长的数据,没有时间限制,因为是存到浏览器端;
- session存储的数据是在服务器端,相对安全和稳定,适合存储安全性高的数据,但是因为有时间限制,所以存储的数据不需要长期保存,例如保存这个登录状态,离开一段时间之后,需要重新登录
那上面就衍生出一个问题,想存储时间长,安全性高的数据怎么办呢?
- 对数据进行加密,通过cookie存储到浏览器