本文主要介绍了cookie和session的区别和联系 .
1.cookie是浏览器在本地持久化存储数据的一种机制
服务器返回给浏览器的
cookie中是键值对结构的数据,并且这里的键值对都是程序员自定义的
cookie可以在浏览器存储一些临时性数据,其中最典型的一种是用方式,就是永存存储身份标识
cookie的内容会在下次访问该网站的时候,自动被带到http请求中
浏览器按照不同的域名分别存储cookie , 域名和域名之间的cookie是不能干扰的 ; cookie存储在硬盘上,一般会有一个超时时间
结合Servlet, 进一步针对cookie和session进行一些实战操作
Cookies getCookies( ) |
获取到请求中所有Cookie内容 . 返回一个数组,每个元素是一个cookie对象每个cookie对象都有键和值. |
getName() |
返回cookie的键 |
getValue() |
返回cookie的值 |
setValue() |
修改cookie的值 |
addCookie(Cookie cookie) |
把指定的cookie添加到响应中 |
示例:访问setcookie请求,代码中就会构造cookie放到响应头
查看响应 .
cookie怎么传输回浏览器?
在http响应里面就会带有header,每一个set-cookie里面都是一个键值对 , 也就是通过这样一个响应头返回给浏览器了,于是浏览器就会持久化保存
后续再次发送请求的时候,cookie的内容就会出现在请求中, 一旦返回给浏览器,就可以在浏览器(edge)查看
后续再次发送请求的时候,cookie的内容就会出现在请求中
访问getcookie , 来查看cookie的内容.
访问getcookie,抓取请求报文 , cookie的内容已经包含在请求头中了 (注意,访问hellosrvlet中的任意一个,请求报文中都会带有该cookie .
getcookie请求报文
服务器调用相关的api就可以往响应里面添加setCookie字段,setCookie里面会包含一些程序员自定义的键值对,浏览器收到这样的字段就会将他们保存在本地,后续再往网站发送请求,就会把这样的键值对请求自动地带到header里面,这也就是cookie的基本流程.
注意:cookie里的数据只是在浏览器暂时歇歇脚,实际上真正发挥作用的,还得是在服务器这边的逻辑中生效 !
使用cookie结合session实现登陆效果,此时就可以更清楚的看到cookie的工作流程了 .
servlet也提供session相关的支持实现登陆功能,不需要直接使用cookie api,直接使用session 的api就可以了
HttpSession getSession() |
在服务器中获取会话 . 最最核心的api
1.如果没有sessison,就会创建除新ession 2.如果已经有了session,就能够查询到session
1.不存在会话就返回null 2.存在会话就直接查询 |
1.先读取请求中的cookie,看cookie中是否有jsessionid(sessioid)属性,以及值是什么;
2.如果确实需要创建会话,就会创建一个session对象,同时生成一个唯一的jsessionid, 以jsessionid为键,以session对象为值,把这个键值对插入到服务器上的哈希表中 3.刚才生成的jsessionid又会通过addcookie方法,加入到响应中,此时响应中就会带有set-cookie字段,这里的值就是jsessionid=****,通过响应,就把jsessionid返回到浏览器了. |
HttpSeesion类中的方法
getAttribute(String name) |
返回该session会话中具有指定名称的对象 |
setAttribute(String name,Object value) |
使用一个指定的名称绑定到一个对象到该session会话 |
session存在的意义,也是为了让用户保存一些自定义的数据,此处session更像是一个Map
,此时程序员想保存什么样的键值对,就可以直接进行设置
在服务器上存有很多session,每个用户都有一个自己的session,一个服务器同时会有多个session,服务器就会使用Map的方式来组织多个session
( 每个session对象,又可以存储键值对 )
通过编写一个登陆页面,来使用上述api,进一步体会cookie和session之间的关系和作用
一个form表单,用户点击登陆,如果输入正确,就会发起一个http请求,服务器就会根据这个请求做出响应 (后面)
服务器对客户端的登陆请求计算响应, HttpSession session= req.getSession(true) 将getSession的参数设置为true , 如果该请求存在session就查询并返回该session对象 ; 如果不存在session就创建新的session对象 , 同时还可以通过setAttribute设置一些自定义数据 .
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 java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取到用户名和密码
String username=req.getParameter("username");
String password=req.getParameter("password");
if(username==null || password==null ||username.equals("") || password.equals("")){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("请求的参数不完整");
return;
}
//2.验证用户名密码是否正确
if(!username.equals("zhangsan")){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("用户名错误");
return;
}
if(!password.equals("123")){
resp.setContentType("text/html; charset=utf8");
resp.getWriter().write("密码错误");
return;
}
//3.登陆成功 此时就可以给这个用户创建回话
//如果存在session就查询到它 , 如果不存在session就创建新session
HttpSession session= req.getSession(true);
//在会话中,可以顺便保存点自定义数据,比如保存一个登陆的时间戳
session.setAttribute("username",username);
session.setAttribute("time",System.currentTimeMillis());
//4.让页面自动跳转到网站主页
resp.sendRedirect("index");
}
}
主页需要使用getSession的false参数先验证用户的登陆状态, 如果存在session就返回会话,如果不存在就返回nul , 同时还可以通过getAttribute方法根据key 获得value.
登陆成功之后,后续再访问主页,请求头的cookie中就会自动带上JSESSIONID, 验证身份的时候就可以获取到这个session对象 , 也就实现了自动登陆效果了.