【JavaWeb】Cookie和Session

目录

Cookie定义

Cookie数据的来源

Cookie数据的存储

Cookie数据的使用

使用Cookie原因

Session

Session定义

如何存储数据

Cookie和Session的区别

使用Cookie和Session简单实现登录页面


Cookie定义

Cookie是浏览器提供持久化存储数据的机制。

Cookie数据的来源

Cookie中的数据通过服务器发送给浏览器的。

其中返回的响应中有 Set-Cookie这个部分,这就是服务器给浏览器的Cookie。

Cookie数据的存储

Cookie数据会存储在主机的硬盘中。数据根据域名来分类存放。

Cookie数据的使用

当浏览器访问之前访问过的服务器之后,就会把在本地保存的Cookie数据读取出来放到请求报文的头部中,这样当服务器收到后,就可以知道这个客户端之前已经连接过了,都和它发生了什么。

使用Cookie原因

由于HTTP协议是无状态(客户端和服务器之间的每次通信之间没有任何的关系)协议,但是这又不符合平时的情景。当用户登录后,下次再次登录就需要判断用户之前是否登录过。

服务器所要服务的客户端有很多,当有了Cookie后,不同的客户端发送给服务器的请求有了Cookie加持后,就会让服务器少做很多重复性的工作,大大减轻了服务器的负担。


Session

Session定义

Session是服务器提供持久化存储数据的机制。

服务器收到的请求有很多,这些请求中有些是带有Cookie的请求。但是如何识别验证Cookie的,就是通过服务器存储的Session来验证的。

如何存储数据

Session的本质是类似于一个哈希表的结构。

Key:令牌ID(sessionId/token)

Value:用户信息(服务器自己设置),用户信息也是类似于哈希表的结构。

从session角度看:sessionId是服务器自己生成的一个“唯一的字符串”

从整个登录流程来看:这个sessionId叫做token

 

Cookie和Session的区别

Cookie和Session的关联就是在网页登录的时候配合使用

区别:

1、cookie是客户端的存储机制;session是服务器的存储机制。

2、cookie中存储的信息可以是多种多样的;session就是专门用来保存用户信息的。

3、cookie和浏览器是强相关的,可以不是在登录(不和session搭配)情况下单独使用;

session可以在其他地方使用,比如手机APP登录时(不和cookie搭配使用)和其他搭配使用。

4、cookie属于HTTP协议中的一部分;session和HTTP协议无关。


使用Cookie和Session简单实现登录页面

package login;

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("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        获取session,有则获取并创建对象,无则啥也不干
//        如果有cookie,则通过cookie中的sessionId来查对应的value,然后获取到session对象
        HttpSession httpSession = req.getSession(false);
        if (httpSession == null) {
            System.out.println("用户未登录!");
            resp.sendRedirect("login.html");
            return;
        }
        String userName = (String)httpSession.getAttribute("userName");
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("欢迎" + userName + "回来");
    }
}
package login;


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 {
//        提前把req设置成utf8,否则当用户输入的是中文会出现bug
        req.setCharacterEncoding("utf8");
        String userName = req.getParameter("userName");
        String passWord = req.getParameter("passWord");

//        验证账户和密码是否正确
//        这里用户只有 张三 123
        if (!userName.equals("张三")) {
            System.out.println("用户名错误!");
            resp.sendRedirect("login.html");
            return;
        }
        if (!passWord.equals("123")) {
            System.out.println("密码错误!");
            resp.sendRedirect("login.html");
            return;
        }

//        登陆成功
//        创建一个session
        HttpSession httpSession = req.getSession(true);
//        创建完session后同时也把cookie也创建好了
//        同时返回时把sessionId返回给浏览器
        httpSession.setAttribute("userName", userName);
        resp.sendRedirect("index");
    }

}

抓包: 


有什么错误评论区指出。希望可以帮到你。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值