Cookie和Session

目录

一、Cookie

二、Session

三、有关Cookie和Session的Servlet的API

四、Cookie与Session的搭配使用举例

1、客户端发起form请求

2、服务器接收请求

3、页面效果

4、抓包


一、Cookie

是http请求中,header的一个属性。Cookie是存储在客户端的小型文本文件,由服务器发送给客户端,客户端会将其存储在本地。它可以用于存储用户的身份标识(sessionID),每次客户端向服务器发送请求时,会自动携带相应的Cookie信息,服务器就会根据Cookile中的sessionID,寻找对应的session对象,sessionID和session对象是一组键值对,在session对象中存储的是客户端的基本信息,由程序员自定义,以键值对形式存在。若客户端第一次访问该浏览器时,还没有Cookie信息,服务器收到请求后会为客户端建立一个session对象,在响应信息中,服务器会返回给客户端。

二、Session

Session则是在服务器端存储用户信息的一种机制。当用户第一次访问浏览器时,服务器会为其创建一个唯一的会话ID,并将相关信息存储在服务器端。客户端会收到这个会话ID,并在后续的请求中将其发送给服务器。服务器通过这个会话ID可以获取用户的信息,实现状态管理和用户识别。Session是保存在内存中的,重启服务器时,Session信息就丢失了。

三、有关Cookie和Session的Servlet的API

1、获取请求中的Cookie或Session

2、增加响应中的Cookie,返回给客户端

3、对session对象内容的操作

四、Cookie与Session的搭配使用举例

实现一个登陆页面,通过用户名和密码登陆,登陆成功欢迎用户。

1、客户端发起form请求
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .container {
            width: 600px;
            margin: 20px auto;
        }
        h1 {
            text-align: center;
        }
        .row {
            display: flex;
            height: 40px;
            justify-content: center;
            align-items: center;
        }
        .row span{
            width: 80px;
        }
        .row input{
            width: 200px;
            height: 30px;
        }
    </style>
</head>
<body>
    <form action="login" method="post">
       <div class="container">
        <h1>登陆系统</h1>
        <div class="row">
            <span>用户名</span>
            <input type="text" name="username">
        </div>
        <div class="row">
            <span>密码</span>
            <input type="text" name="password">
        </div>
        <div class="row">
            <span></span>
            <input type="submit" value="登陆">
        </div>
       </div>
    </form>
</body>
</html>

页面:

2、服务器接收请求

(1)建表

create database if not exists logins_list charset utf8;
use logins_list;
drop table if exists lists;
-- 删表目的是为了, 防止之前数据库里有一样的表, 对咱们的代码产生干扰.
create table lists(username varchar(1024),password varchar(1024));

(2)获得数据源

 private DataSource dataSource=new MysqlDataSource();
    @Override
    public void init() throws ServletException {
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/message_wall?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("272222");
    }

(3)处理请求

①登陆服务器

根据请求中的username去数据库中查找password,与请求中的password做对比,出现为空或错误则登陆失败,登陆成功时,为用户建立session对象,在session对象中添加username和登陆时间。


import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

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 javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


@WebServlet("/login")
public class loginServlet extends HttpServlet{
    private DataSource dataSource=new MysqlDataSource();
    @Override
    public void init() throws ServletException {
        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/logins_list?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("272222");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        //根据用户名查找密码
        //结果为空,用户未注册;密码不正确;
        try {
            String password1=select(username);
            if(password1==null||!password1.equals(password)){
                //登陆失败
                resp.setContentType("text/html;charset=utf8");
                resp.getWriter().write("用户未注册或密码错误");
                return;
            }
            //登陆成功
            HttpSession session=req.getSession(true);
            //获取session对象 没有建立一个;
            //先session对象里添加内容:用户名和登陆时间 其他servlet也可以使用
            session.setAttribute("username",username);
            session.setAttribute("logintime",System.currentTimeMillis());
            //跳转到登陆成功页面
            //跳转时会把cookie信息带上
            resp.sendRedirect("index");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    public String select(String username) throws SQLException {
        Connection connection=dataSource.getConnection();
        String sql="select password from lists where username=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,username);
        ResultSet resultSet=statement.executeQuery();
        String password=null;
        while (resultSet.next()){
            password=resultSet.getString("password");
        }
        return password;
    }
}

②登陆结果服务器

登陆成功后,跳转到登陆成功页面。若session为空,在登陆页面并未登陆;若不为空,取出session对象的用户名和时间,添加到响应正文中。

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.text.SimpleDateFormat;

@WebServlet("/index")
public class indexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session=req.getSession(false); //没有代表未登陆 不生成新的会话
        resp.setContentType("text/html;charset=utf8");
        if(session==null){
            //未登录
            resp.getWriter().write("您当前未登录!!!");
            return;
        }
        String username=(String) session.getAttribute("username"); //object类型 强转
        Long logintime=(Long) session.getAttribute("logintime");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time=simpleDateFormat.format(logintime);
        resp.getWriter().write("欢迎你"+username+"!!!"+"\r\n");
        resp.getWriter().write("你上次登录时间为:"+time);
    }
}
3、页面效果

 

4、抓包

登陆请求(POST)

登陆跳转(GET)

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ambition…

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

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

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

打赏作者

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

抵扣说明:

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

余额充值