这是鄙人在学习中自己总结和领悟的一些东西,如有错误或误解,请及时告知,以免对他人学习造成误解,以下是鄙人卓见,望有所帮助,同进步!
首先来看Cookie
,在HTTP中看起来像是表示服务器向客户端发送小甜饼,Cookie本质上是一个Map结构的键值对,随着服务端的响应发送给客户端浏览器,然后客户端浏览器会将Cookie保存到本地,当下一次在访问的时候把Cookie在发送给服务器。
其实说这些概念看起来就让人看不下去,图片才是最好接受的方式,这篇文章我会以项目实例和图片给大家展示Cookie和Session
,真实的Cookie应该是什么样子的,接下来,我先给大家看一下Cookie在本地电脑中存放的位置,以及在访问网站的时候Cookie是如何通过报文发送给客户端浏览器
我先给大家上图,最后在总结Cookie和Session的区别,
C:\Users\user\AppData\Local\Google\Chrome\User Data\Default\Cache
当然如何查看这些数据还是交给浏览器吧,
访问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信息如下
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数据
这里的Cookie数据是不是就是刚刚在ACookieServlet中设置的Cookie信息,并且它有它的到期时间,是会话结束也就是浏览器关闭,其实Cookie是可以设置存在周期的,那这个事情就交给你自己去查一下如何设置Cookie的存在周期了
Cookie还可以设置路径如cookie.setPath("/JavaWeb_Cookie/Servlet")
通过设置路径后,以后这个Cookie只能在这个路径下的Servlet或者jsp能够获取到该cookie中的信息,其他路径都不可以
Response Headers
)中出现Set-Cookie:name=valueRequest Headers
)中出现Cookie信息首先,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中存放着一个JSESSIONID的信息,但是我们在Servlet中并没有设置Cookie的信息,这其实就是Session是为什么要依赖于Cookie了,Session底层数据结构的就是Map类型,存放在服务端,也是键值对的形式
在来看浏览器中Cookie的信息
你会发现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);
}
}
在来看报文
发现这里的request请求体中有了Cookie信息,存放的就是JSESSIONID,而且仔细观察发现整个访问过程中JSESSIONID都是一样的,我在BSessionServlet中获取了session的id,打印在页面上,这个sessionId和JSESSIONID也是一样的
在仔细看ASessionServlet中的代码,我设置了session的最大不活动时间为30秒,30秒后在访问该BSessionServlet,看页面
session已经不存在了,但是,看报文
发现没有,这里的响应体中又设置了Cookie信息,并且又创建了一个新的JSESSIONID,与之前的不一样,这就是代码中request.getSession()
的作用了,看代码中的注释,但是请求体中也有JSESSIONID,与之前的一样,但是session设置了存在时间为30s,已经获取不到session的信息了
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
这里图解:(此图来源于网络)
对于Session和Cookie的理解并不是特别到位,很多内容没有在文中写出,Cookie和Session内容其实还有很多,文中如有错误劳烦指出!!