session 和 Cookie 详解

目录

工作原理

HttpServletRequest 类中的相关方法

HttpSession 相关方法

例子:


工作原理

  • 当用户第一次访问Servlet时,服务器端会给用户创建一个独立的Session
  • 并且生成一个SessionID,这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中
  • 当用户再一次访问Servlet时,请求中会携带着cookie中的SessionID去访问
  • 服务器会根据这个SessionID去查看是否有对应的Session对象
  • 有就拿出来使用;没有就创建一个Session(相当于用户第一次访问)

而 Cookie 和 Session 最典型的使用就是,存储登录信息 ( 重要 )

  1.  浏览器 访问 login.html 页面
  2.  服务器返回 登录页面
  3.  用户收到页面后 在页面上输入账号 密码,并点击登录。这时浏览器带着账号 密码 向服务器发送 post请求
  4.  浏览器收到账号密码,然后对进行校验,如果没有问题,则会创建一个session会话 ( session 就相当于是一个对象,可以存储需要的内容,以 sessionId 为key,session对象为 value,将内容存储到内存的哈希表中。而一个服务器对应很多客户端,每个客户端也都有自己的 session,所以哈希表中也就有很多的键值对 )
  5.  浏览器收到这个 session 会把 sessionId 保存到本地,后面的页面验证登录或者发送请求的时候,就可以在 Cookie 中带上 sessionId
  6.  服务器再次收到请求,就可以根据 sessionId 来判断这个会话是否存在,从而验证是否登录。

HttpServletRequest 类中的相关方法

HttpSession  getSession ( )   在服务区中获取会话 ,参数可以为 true 或者 false

  •  true :代表不存在会话会新建会话,通常用在登录判断的时候
  •  false :代表不存在会话 也不会新建会话,通常用在判断登录状态页面

Cookie[ ]    getCookie ( )     返回一个数组,包含客户端发送该请求的所有Cookie对象。会自动把Cookie在的格式解析成键值对

HttpSession 相关方法

 void   setAttribute ( "sessionName" , Object ); 

设置 session 值,sessionName 是名称,object 是你要保存的对象。

 Object   getAttribute ( "sessionName" );

得到对应名称的session值,即得到object对象,注意需要进行类型转换

 

例子:

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;
import java.util.Objects;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        //1.从请求中获取 userName 和 passWord
        String userName = req.getParameter("userName");
        String passWord = req.getParameter("passWord");
        //1. 判断是否输入为空
        if (userName == null || passWord == null) {
            resp.getWriter().write("用户名或者密码为空!");
            return;
        }
        //2.查询数据库,验证用户名密码是否正确
        UserDao userDao = new UserDao();
        User user = userDao.selectByName(userName);
        if (user == null || !Objects.equals(user.getPassWord(), passWord)) {
            resp.getWriter().write("用户名或者密码错误!");
            return;
        }
        //3.正确的话创建一个会话  session
        HttpSession session = req.getSession(true);
        //在会话中保存一下user,以备后续使用
        session.setAttribute("user",user);
        //构造302响应报文
        resp.sendRedirect("blog_list.html");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用这个方法对当前的登录状态进行判定
        //1. 获取当前会话
        HttpSession session = req.getSession();
        if (session==null) {
            //没有会话 则就是无登录访问
            resp.setStatus(403);
            return;
        }
        User user = (User) session.getAttribute("user");
        if (user==null){
            //有会话,但没有user  也认为是无登录状态
            resp.setStatus(403);
            return;
        }
        //走到这一步  说明有 user ,也就说明已经登录,则返回正常的200即可
        resp.setStatus(200);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shn!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值