cookie与session

cookie

作用

就是用来保存浏览器会话过程中产生的数据,比如我们在网页上登录,下次打开该网页,发现会有提示我们之前输入过的信息,这便用到cookie

保存数据的原理

这里先模拟一个浏览器手机号登录功能,下次打开浏览器登录会发现,输入框会提示我们之前输入的手机号

cookie与session_第1张图片

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只会创建一次

cookie与session_第2张图片

session也是域对象,我们知道域对象具有一个可以访问的map集合,并且具有访问范围,通过该对象的map集合可以在当前范围内实现数据共享。session对象也提供了一些方法,比如添加域属性,获取域属性

session的创建

在第一次调用request.getSession方法时创建对象,只创建一次;HttpSession session=request.getSession();

session销毁的两种场景

  • session默认误操作是30分钟超时,超时销毁;

  • 人为销毁,或者意外销毁,比如断电等

正常关闭服务器,ssession为什么不会销毁?

但是如果服务器正常关闭,session是不会销毁的,假如我们发布了一个web项目,正在运行,此时我们关闭服务器,我们用Tomcat举个例子:

我发布了一个web应用,正在运行

cookie与session_第3张图片

此时我们正常关闭tomcat服务器

cookie与session_第4张图片 

打开目录tomcat8/work/Catalina/localhost/SessionTest,会发现多了一个ser

cookie与session_第5张图片

然后再次启动服务器

cookie与session_第6张图片

打开目录tomcat8/work/Catalina/localhost/SessionTest,会发现ser没有了

cookie与session_第7张图片

当服务器正常关闭,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文件的根目录下设置,分钟

 

  1

 

判断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进制数

cookie与session_第8张图片

此时我们再次把session传给服务器,是同一个session,如果销毁,才会变

cookie与session_第9张图片

cookie和session的区别

  • cookie存储的数据容易丢失或者被窃取,我们可以直观的看和删除,所以cookie存储数据 不稳定也不安全,所以适合保存安全性不高的数据,适合保存时间长的数据,没有时间限制,因为是存到浏览器端;
  • session存储的数据是在服务器端,相对安全和稳定,适合存储安全性高的数据,但是因为有时间限制,所以存储的数据不需要长期保存,例如保存这个登录状态,离开一段时间之后,需要重新登录

那上面就衍生出一个问题,想存储时间长,安全性高的数据怎么办呢?

  • 对数据进行加密,通过cookie存储到浏览器

你可能感兴趣的:(java,cookie,session)