小谈Cookie Session

Cookie和Session的区别和联系

  • Cookie(小甜饼)
    • Google浏览器在本地存放Cookie文件的位置
    • 如何在Servlet中添加Cookie信息以及在Google浏览器中查看Cookie的数据
      • Cookie注意(小总结):
  • Session(会话)
  • 总结
    • Cookie
    • Session

这是鄙人在学习中自己总结和领悟的一些东西,如有错误或误解,请及时告知,以免对他人学习造成误解,以下是鄙人卓见,望有所帮助,同进步!

Cookie(小甜饼)

首先来看Cookie,在HTTP中看起来像是表示服务器向客户端发送小甜饼,Cookie本质上是一个Map结构的键值对,随着服务端的响应发送给客户端浏览器,然后客户端浏览器会将Cookie保存到本地,当下一次在访问的时候把Cookie在发送给服务器。

其实说这些概念看起来就让人看不下去,图片才是最好接受的方式,这篇文章我会以项目实例和图片给大家展示Cookie和Session,真实的Cookie应该是什么样子的,接下来,我先给大家看一下Cookie在本地电脑中存放的位置,以及在访问网站的时候Cookie是如何通过报文发送给客户端浏览器

我先给大家上图,最后在总结Cookie和Session的区别,

Google浏览器在本地存放Cookie文件的位置

C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Cache
小谈Cookie Session_第1张图片
当然如何查看这些数据还是交给浏览器吧,

如何在Servlet中添加Cookie信息以及在Google浏览器中查看Cookie的数据

访问chrome://settings/siteData就可以进入到Google的Cookie页面

接下来我给大家看一下真实的案例如何在Servlet中添加Cookie信息

1.设置Cookie信息

package com.yckj.javaweb.day07.example;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ACookieServlet
 */
@WebServlet("/ACookieServlet")
public class ACookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//创建Cookie对象,并设置该Cookie的键值
		Cookie cookie1 = new Cookie("name", "zhangsan");
		Cookie cookie2 = new Cookie("sex", "man");
		Cookie cookie3 = new Cookie("age", "18");
		
		//设置响应体类型
		response.setContentType("text/html;charset=UTF-8");
		
		//调用response的addCookie()方法将Cookie添加到response响应体当中
		response.addCookie(cookie1);
		response.addCookie(cookie2);
		response.addCookie(cookie3);
		
		//发送成功后在页面输出一句话
		PrintWriter pWriter = response.getWriter();
		pWriter.print("Servlet请求成功,响应将携带三个Cookie到浏览器");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

当访问该Servlet时,页面信息和报文中Cookie信息如下
在这里插入图片描述
小谈Cookie Session_第2张图片
2.获取Cookie信息

package com.yckj.javaweb.day07.example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BCookieServlet
 */
@WebServlet("/BCookieServlet")
public class BCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		//响应中Cookie存放的都是一堆键值对,所以获取它应该是用数组获取
		Cookie[] cookies = request.getCookies();
		PrintWriter out = response.getWriter();
		//判空
		if (cookies != null && cookies.length > 0) {
			//使用forEach循环遍历Cookie数组
			for(Cookie cookie : cookies) {
				String name = cookie.getName();
				String value = cookie.getValue();
				//在页面打印Cookie信息
				out.print("[name:"+name+"  ,value:"+value+"]"+"
"
); } } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

小谈Cookie Session_第3张图片
小谈Cookie Session_第4张图片

在回头看浏览器中的Cookie数据
小谈Cookie Session_第5张图片
小谈Cookie Session_第6张图片
这里的Cookie数据是不是就是刚刚在ACookieServlet中设置的Cookie信息,并且它有它的到期时间,是会话结束也就是浏览器关闭,其实Cookie是可以设置存在周期的,那这个事情就交给你自己去查一下如何设置Cookie的存在周期了
Cookie还可以设置路径如cookie.setPath("/JavaWeb_Cookie/Servlet")通过设置路径后,以后这个Cookie只能在这个路径下的Servlet或者jsp能够获取到该cookie中的信息,其他路径都不可以

Cookie注意(小总结):

  • 在第一次访问ACookieServlet时,是设置Cookie信息,并将Cookie信息放在响应体当中通过HTTP协议发送给浏览器,所以在报文响应头(Response Headers)中出现Set-Cookie:name=value
  • 当访问BCookieServlet时,并没有设置Cookie信息,只是获取本地的Cookie信息,所以并不会在响应体中出现Cookie信息,而是在请求体(Request Headers)中出现Cookie信息
  • Cookie是通过服务器设置,并放在报文中通过访问该路径将其发送给浏览器,浏览器将其解析并保存在本地的电脑磁盘上,当在Cookie的存在周期内再次访问该应用,浏览器就会将Cookie信息在解析放在请求体当中。

小谈Cookie Session_第7张图片

Session(会话)

首先,Session是存放在服务端的,本地看不见,也不会携带在响应报文中,但是,Session能够读取信息并展示在页面中需要依赖于Cookie,那是如何依赖的,接下来我还是通过实例加图片展示给大家

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.jasper.tagplugins.jstl.core.Out;


/**
 * Servlet implementation class ASessionServlet
 */
@WebServlet("/ASessionServlet")
public class ASessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
  

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		//创建Map,存放数据
		Map<String,Object> map = new HashMap<>();
		map.put("name","zhangsan");
		map.put("sex", "man");
		map.put("age", 18);
		
		//如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么应用创建session并返回。
		HttpSession session = request.getSession();
		//session是JavaWeb四大域对象之一,使用它的域属性,使其在应用内可以共享
		session.setAttribute("map", map);
		//设置session的最大不活跃时间,以秒为单位
		session.setMaxInactiveInterval(30);
		
		PrintWriter pWriter = response.getWriter();
		pWriter.print("session设置成功");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

在这里插入图片描述
在去看报文
小谈Cookie Session_第8张图片
发现这里的Cookie中存放着一个JSESSIONID的信息,但是我们在Servlet中并没有设置Cookie的信息,这其实就是Session是为什么要依赖于Cookie了,Session底层数据结构的就是Map类型,存放在服务端,也是键值对的形式

在来看浏览器中Cookie的信息
小谈Cookie Session_第9张图片
你会发现Cookie中存放的JSESSIONID的内容和报文中的一样,在接下来访问BSessionServlet

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class BSessionServlet
 */
@WebServlet("/BSessionServlet")
public class BSessionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
   
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		HttpSession session = request.getSession();
		//获取session域中的map属性,并强转为Map类型
		Map<String, Object> map = (Map<String, Object>)session.getAttribute("map");
		PrintWriter pWriter = response.getWriter();
		String sessionId = session.getId().toString();
		//判断一下session域中map属性是否存在,
		if (map != null) {
			String name = (String)map.get("name");
			String sex = (String)map.get("sex");
			int age = (int)map.get("age");
			pWriter.println("name:"+name+",sex:"+sex+",age:"+age);
			pWriter.println("sessionId:"+sessionId);
		}else {
			pWriter.print("session过期了");
		}
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

在这里插入图片描述
在来看报文
小谈Cookie Session_第10张图片
发现这里的request请求体中有了Cookie信息,存放的就是JSESSIONID,而且仔细观察发现整个访问过程中JSESSIONID都是一样的,我在BSessionServlet中获取了session的id,打印在页面上,这个sessionId和JSESSIONID也是一样的

在仔细看ASessionServlet中的代码,我设置了session的最大不活动时间为30秒,30秒后在访问该BSessionServlet,看页面
在这里插入图片描述
session已经不存在了,但是,看报文
小谈Cookie Session_第11张图片
发现没有,这里的响应体中又设置了Cookie信息,并且又创建了一个新的JSESSIONID,与之前的不一样,这就是代码中request.getSession()的作用了,看代码中的注释,但是请求体中也有JSESSIONID,与之前的一样,但是session设置了存在时间为30s,已经获取不到session的信息了

当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
这里图解:(此图来源于网络)
小谈Cookie Session_第12张图片

总结

Cookie

  1. 以键值对的形式并以文件作为载体存放在本地,浏览器可以通过报文查看Cookie的内容
  2. 生命周期:默认是会话结束(浏览器关闭前)

Session

  1. 通过JSESSIONID来唯一标识Session对象,并将JSESSIONID以键值对存放到Cookie当中,而Session对象存放在服务器中
  2. 生命周期:Tomcat默认存在时间为30min

对于Session和Cookie的理解并不是特别到位,很多内容没有在文中写出,Cookie和Session内容其实还有很多,文中如有错误劳烦指出!!

你可能感兴趣的:(JavaWeb,Cookie和Session,Cookie,Session)