Cookie和Session区别及原理

Cookie和Session区别及原理

1、Cookie1.1、Cookie 简介会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。 所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。Cookie 是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。用户在提交第一次请求后,由服务器生成 Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将 Cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的 Cookie 数据,发送到服务端,由服务器对会话进行跟踪。Cookie 是由若干键值对构成,这里的键一般称为 name,值称为 value。Cookie 中的键值对均为字符串。1.2、绑定路径 JavaEE 中的 Cookie

代码语言:javascript代码运行次数:0运行复制@RestController

public class MyCookie {

@RequestMapping("/cookie/test/getCookie")

public String getCookie(HttpServletResponse response){

//创建Cookie对象

Cookie cookie1 = new Cookie("username", "tom");

Cookie cookie2 = new Cookie("password", "123456");

//将Cookie添加到响应中

response.addCookie(cookie1);

response.addCookie(cookie2);

return "success";

}

}首次访问,只有响应中存在Cookie,请求中没有 访问路径(http://localhost:8080/cookie/test/getCookie)由资源路径(http://localhost:8080/cookie/test/)与资源名称(getCookie)构成

默认绑定的资源路径

这里绑定的路径的就是域名+路径

相同资源路径不同资源名称访问

即使404空指针也会携带Cookie,因为资源路径(http://localhost:8080/cookie/test/)一致

资源路径(http://localhost:8080/cookie/testOne/)不一致,所有请求中没有携带Cookie

设置绑定路径

代码语言:javascript代码运行次数:0运行复制@RestController

public class MyCookie {

@RequestMapping("/cookie/rest/getCookie")

public String getCookie(HttpServletRequest request,HttpServletResponse response){

//创建Cookie对象

Cookie cookie1 = new Cookie("user", "jack");

Cookie cookie2 = new Cookie("pwd", "666999");

//设置Cookie对象绑定的路径

cookie1.setPath(request.getContextPath() + "/rest");

cookie2.setPath(request.getContextPath() + "/cookie");

//将Cookie添加到响应中

response.addCookie(cookie1);

response.addCookie(cookie2);

return "success";

}

}首次访问,响应中可以看的Cookie及绑定路径cookie1绑定路径/test,这里没有绑定上cookie2绑定路径为/cookie,访问路径为http://localhost:8080/cookie/rest/get,所以绑定路径+/*的请求都可以在请求中拿到Cookie

所以,当path=/则表示此ip端口下的请求都会携带此Cookie

1.3、Cookie保存位置默认情况下,Cookie 是保存在浏览器的缓存中的,浏览器关闭,缓存消失,Cookie 消失。Cookie 类中有一个方法可以设置 Cookie 的有效时长setMaxAge(int expiry),形参 expiry 的单位为秒,整型若其值大于 0,则表示要将 Cookie 写入到硬盘文件中;小于 0,则表示 Cookie 存放在浏览器缓存中,与不设置时长等效;等于 0,则表示 Cookie产生后直接失效。代码语言:javascript代码运行次数:0运行复制@RestController

public class MyCookie {

@RequestMapping("/cookie/rest/getCookie")

public String getCookie(HttpServletRequest request,HttpServletResponse response){

//创建Cookie对象

Cookie cookie1 = new Cookie("user", "jack");

Cookie cookie2 = new Cookie("pwd", "666999");

//设置Cookie对象绑定的路径

cookie1.setPath(request.getContextPath() + "/");

cookie2.setPath(request.getContextPath() + "/");

//设置Cookie的有效期

cookie1.setMaxAge(60 * 60); //有效时长为1小时

cookie2.setMaxAge(60 * 60 * 24 * 10); //有效时长为10天

//将Cookie添加到响应中

response.addCookie(cookie1);

response.addCookie(cookie2);

return "success";

}

}请求头中已添加有效期

pwd的Cookie的过期时间10天后

1.4、服务端读取请求中的 Cookie代码语言:javascript代码运行次数:0运行复制@RestController

public class GetCookie {

@RequestMapping("/cookie/getCookie")

public String getCookie(HttpServletRequest request,HttpServletResponse response){

//从请求中获取Cookie

Cookie[] cookies = request.getCookies();

for (Cookie cookie : cookies) {

System.out.println(cookie.getName());

System.out.println(cookie.getValue());

}

return "success";

}

}2、Session2.1、Session简介Session,即会话,是 Web 开发中的一种会话状态跟踪技术。Session 则是将会话状态保存在了服务器端。2.2、Session基本操作 Session 对象的创建

1)通过 HttpServletRequest 的 getSession() 方法获取。该方法具有两个重载的方法。

public HttpSession getSession(boolean create):该方法用于创建 Session。若参数 create 为 true,则表示若当前没有Session,则新建一个 Session,若当前存在 Session 则使用当前的 Session。若参数 create 为 false 表示若当前没有 Session,则直接返回 null。public HttpSession getSession():相当于 getSession(true),即没有 Session 则创建新的Session。2)何时使用 getSession(true),即 getSession(),何时使用 getSession(false)呢?

若要向 Session 中存放数据, 则使用 getSession(true),即 getSession()。意义为:若当前存在 Session,则使用当前的 Session;若当前不存在 Session,则创建一个新的Session。因为存放数据是必须要有 Session 的。若要从 Session 中获取数据,则一般使用 getSession(false)。意义为:若当前存在 Session,则从中获取数据;若当前根本就没有 Session,那就更不可能存在 Session 中的数据了。因为你要查找的数据只可能出现在已经存在的 Session 中,而不可能存在于新建的 Session 中。 Session 域属性空间的操作

public void setAttribute(String name, Object value):用于向 Session 的域属性空间中放入指定名称、指定值的域属性。public Object getAttribute(String name):用于从 Session 的域属性空间中读取指定名称为域属性值。public void removeAttribute(String name):用于从 Session 的域属性空间中删除指定名称的域属性。 JavaEE 中的 Session

代码语言:javascript代码运行次数:0运行复制@RestController

public class MySession {

@RequestMapping("/session/setSession")

public String setSession(HttpServletRequest request,HttpServletResponse response){

//获取Session对象

HttpSession session = request.getSession();

//向Session域属性空间中存放属性

session.setAttribute("pets", "dog");

return "session存储属性pets=dog;默认过期时间:"+session.getMaxInactiveInterval()+"秒";

}

@RequestMapping("/session/getSession")

public String getSession(HttpServletRequest request,HttpServletResponse response){

//获取Session对象

HttpSession session = request.getSession(false);

if(session != null){

return "session对象获取属性pets为:"+session.getAttribute("pets");

}else {

return "session对象为空";

}

}

}session添加属性session.getMaxInactiveInterval():获取session过期时间,通过set设置过期时间默认时间单位为秒,1800秒也就是30分钟也可以通过配置文件server.servlet.session.timeout=60m设置过期时间为1小时

session获取属性信息

2.3、Session 的工作原理

在服务器中系统会为每个会话(浏览器开关)维护一个 Session。不同的会话,对应不同的 Session。

写入 Session 列表

服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为Session列表。该Map的key为一个32位长度的随机串,这个随机串称为JSESSIONID,value则为Session 对象的引用。当用户第一次提交请求时,服务端Servlet中执行到request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新生成的JSESSIONID,value则为新创建的HttpSession对象。 服务器生成并发送Cookie

在将 Session 信息写入 Session 列表后,系统还会自动将“JSESSIONID”作为 name,这 个 32 位长度的随机串作为 value以Cookie 的形式存放到响应报头中,并随着响应,将该Cookie 发送到客户端。 注意: Cookie过期时间依然为默认浏览器关闭,Session过期时间这里为默认30分钟

客户端接收并发送 Cookie

客户端接收到这个 Cookie 后会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的 Cookie 就不会消失。当用户提交第二次请求时,会将缓存中的这个 Cookie,伴随着请求的头部信息,一块发送到服务端。 从 Session 列表中查找

服务端从请求中读取到客户端发送来的 Cookie,并根据 Cookie 的 JSSESSIONID 的值,从Map 中查找相应 key 所对应的 value,即 Session 对象。 然后,对该 Session 对象的域属性进行读写操作。也就是说关闭浏览器,再发送请求,则找不到对应的Session对象了,因为Cookie的JSSESSIONID已过期了不同的浏览器,Cookie的JSSESSIONID 不一样,则Session不一样,即属性值也可能不一样2.4、Session 的失效Session 的失效就是指 Session 的超时。若某个Session 在指定的时间范围内一直未被访问,那么 Session 将超时,即将失效。默认 Session 的超时时间为 30 分钟。需要再次强调的是,这个时间并不是从 Session 被创建开始计时的生命周期时长,而是从最后一次被访问开始计时,在指定的时长内一直未被访问的时长。也可通过代码提前使 Session 失效。HttpSession 中的方法 Invalide(),使得 Session 失效。代码语言:javascript代码运行次数:0运行复制@RequestMapping("/session/invalidate")

public String invalidate(HttpServletRequest request,HttpServletResponse response){

//获取Session对象

HttpSession session = request.getSession();

//向Session域属性空间中存放属性

session.setAttribute("pets", "cat");

//使用session失效

session.invalidate();

System.out.println(session);

System.out.println(session.getAttribute("pets"));

return "success";

}输出结果:

注意: Session失效只是不能set和get属性,而非Session对象为null

相关推荐

英雄联盟赵信皮肤秘密特工怎么得
beat365app登录入口

英雄联盟赵信皮肤秘密特工怎么得

📅 07-14 👁️ 6501
如何给U盘,SD卡加密(压缩加密与veracrypt加密)
365bet中文资讯网

如何给U盘,SD卡加密(压缩加密与veracrypt加密)

📅 08-19 👁️ 3731
最受欢迎找茬游戏推荐
beat365app登录入口

最受欢迎找茬游戏推荐

📅 09-22 👁️ 5826