Servlet编程---Day 06

目录

一、会话技术概述

(一)什么是会话技术

(二)会话技术分类:

二、cookie

三、cookie小结

案例:cookie 实现记住用户名密码

四、session 会话

(一)cookie 和session区别

(二)session实现数据共享原理

(三)session细节

案例:Session实现购物车

一、会话技术概述

(一)什么是会话技术

        类似两个人谈话,会话其实就是服务器和客户端的多次请求和响应
        一次会话:多次请求和响应 组成了一次会话。从第一次发送请求建立会话,直到一端断开连接
        http协议:无状态的协议,指的就是不能保存上一次请求和响应的数据,实现客户端和服务器端数据保存共享 依赖于会话技术

(二)会话技术分类:

        客户端会话技术: cookie
        少量数据保存在客户端浏览器上
        优点 :方便(减轻了服务器压力)
        缺点 :数据不安全
        服务器端会话技术:session
        数据保存在服务器上
        优点: 数据安全
        缺点:服务器压力大

二、cookie

        以逛商场为例理解:
        第一次去商场 ---- 买东西 --- vip 卡 (姓名 电话 积分) ---- 给我 ,第二次再去商场的时候 自己主动携带 vip 卡。
        cookie 实现数据共享原理,类似我们的 vip 卡, 第一次请求的时候不会有 vip 卡( cookie ),请求结束,服务器给我响应的时候 会给我vip 卡( cookie ), 下一次去访问服务器的时候,客户会自
vip 卡( cookie )。
        客户端会话技术原理
        通过响应头 set-cookie 和请求头 cookie 来完成的
        Cookie 数据共享实现原理
        第一次访问服务器的时候,请求头没cookie ,但是响应的时候会有一个 set-cookie 的响应头,这个响应头里携带的就是我需要共享的数据,第二次再去请求服务器的时候,会携带一个请求头cookie里的值就是共享数据。
        cookie重要属性
        Name: cookie名称,但不作唯一标识
        Value: cookie 存储的值,不建议存中文
        cookie 细节:
        cookie 设置保存时间 默认保存时间是多久
        setMaxAge() 方法 是设置 cookie 的存活时间 单位秒
        正数:cookie 将会持久化储存再硬盘上,并保存相应的时间
        给0 马上删除
        默认值是-1 代表关闭浏览器或服务器清除

三、cookie小结

Servlet编程---Day 06_第1张图片

        1:一个 cookie 可以标识一种数据
        2:一个浏览器对一个站点可以存储 20 cookie , 总共能存储 300 cookie
        3:cookie 大小在 4kb 以内

案例:cookie 实现记住用户名密码

Servlet编程---Day 06_第2张图片

package com.day06; 
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //接受前端数据
        String username = request.getParameter("username");
        String psd = request.getParameter("psd");

        //校验信息是否正确
        if ("aaa".equals(username) && "123".equals(psd)){
            String rember = request.getParameter("rember");
            //判断记住密码是否勾选
            if (rember != null){
                //创建cookie
                Cookie cookie = new Cookie("uName",username);
                Cookie cookie1 = new Cookie("pWord",psd);
                //设置存活时间
                cookie.setMaxAge(60*60);
                cookie1.setMaxAge(60*60);
                //发送cookie
                response.addCookie(cookie);
                response.addCookie(cookie1);
            }
            //信息正确跳转到成功页面
            request.setAttribute("uname",username);
            request.getRequestDispatcher("success.jsp").forward(request,response);
        }else {
            //信息错误跳转到登陆界面,并友好提示
            request.setAttribute("msg","用户名或密码输入错误");
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

login.jsp页面 

<%--
  Created by IntelliJ IDEA.
  User: 86182
  Date: 2023-5-17
  Time: 10:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    登录


<%
    String cValue = "";
    String cValue1 = "";
    //获取cookie
    Cookie[] cookies = request.getCookies();
    //非空判断
    if (cookies != null){
        //循环遍历cookies数组
        for (Cookie c : cookies) {
            //获取cookie的name属性
            String cName = c.getName();
            //因为会拿到所有的name,所以做个判断,只拿到需要的name
            if ("uName".equals(cName)){
                //获取值
                cValue = c.getValue();
                System.out.println(cValue);
            }
            if ("pWord".equals(cName)){
                //获取值
                cValue1 = c.getValue();
                System.out.println(cValue1);
                break;
            }
        }
    }
%>
    
用户名>
密码>
记住密码 注册
${msg}

四、session 会话

        Session概念 : 在web 开发中 , 我们服务器可以为每一个浏览器创建一个会话对象 (session), 一个浏览器默认独占一个session对象的 , 因此保存用户数据的时候 , 可以将用户信息写在 session Session 依赖于 cookie

(一)cookie session区别

        1: cookie 是把少量数据保存在浏览器上
        2: session 技术是把用户数据写入用户独占的 session 对象中,存在服务器中
        3: session 对象是属于服务器的,获取 session 的方式是 request.getSession()

(二)session实现数据共享原理

        1:服务器创建一个 web 浏览器的 session 对象 并保存
        2:session对象有唯一且非空的 id 用于区别
        3:第一次请求服务器的时候请求头没东西但是会有一个响应头 (set-cookie) 内容是 session id
        4:浏览器会把 sessionid 信息保存在 cookie
        5:新的请求会携带一个请求头 coookie 内容是 sessionid
        服务器会话技术(Session ) 将数据存储再服务器端
        优点: 数据安全
        缺点:不方便 服务器压力大

(三)session细节

        1:如果浏览器关闭了 ,session 对象还是同一个吗?
        不是 浏览器关闭了, 内存释放了 , cookie 也就销毁了 所以 cookie 里的 sessionid 就没了
        2:关闭服务器 , 浏览器不关闭 .session 对象是同一个吗 ?
        session的钝化 : 就是当服务器正常关闭的时候 , 会将 session 对象写到硬盘里
        session的活化 : 当服务器再次开启的时候会将文件 , 还原成 session 对象
        3:session的销毁
        (1)服务器关闭 session 销毁
        (2)session超时: 默认时间 30 分钟(在web.xml里修改)

    60
        (3)session 自杀:安全退出

Servlet编程---Day 06_第3张图片

案例:Session实现购物车

package com.day06;

import com.day06.pojo.Book;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;

@WebServlet("/shoppingServlet")
public class ShoppingServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接收前端数据
        String bookName = request.getParameter("bookName");
        String bookPrice = request.getParameter("bookPrice");
        //把bookName封装成Book对象
        Book book = new Book(bookName,bookPrice);
        //创建session
        HttpSession session = request.getSession();
        //获取session里的books集合
        ArrayList list =(ArrayList) session.getAttribute("books");
        //判断list集合是否为空
        if (list == null){
            //为空,则是第一次请求
            //创建集合 把得到的book对象封装起来
            ArrayList list1 = new ArrayList<>();
            list1.add(book);
            session.setAttribute("books",list1);
        }else {
            //不为空,则不是第一次请求,把book存入集合
            list.add(book);
            session.setAttribute("books",list);
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

book.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: 86182
  Date: 2023-5-17
  Time: 15:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    书本展示


    西游记
    水浒传
    红楼梦
    三国演义
    加入购物车


bookList.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: 86182
  Date: 2023-5-17
  Time: 15:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    购物车



    

你可能感兴趣的:(Servlet编程,servlet,服务器,java,后端,xml)

编号 书名 价格
${s.count} ${book.bookName} ${book.bookPrice}