Servlet编程---Day 06

news2024/7/6 19:34:43

一、会话技术概述

(一)什么是会话技术

        类似两个人谈话,会话其实就是服务器和客户端的多次请求和响应
        一次会话:多次请求和响应 组成了一次会话。从第一次发送请求建立会话,直到一端断开连接
        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小结

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

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

 

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" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<%
    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;
            }
        }
    }
%>
    <form action="${pageContext.request.contextPath}/loginServlet" method="post">
        用户名<input type="text" name="username" value=<%=cValue%>><br>
        密码<input type="password" name="psd" value=<%=cValue1%>><br>
        <input type="checkbox" name="rember" value="111" checked>记住密码
        <input type="submit" value="登录">
        <a href="zhuce.jsp">注册</a>
    </form>
    ${msg}
</body>
</html>

四、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里修改)
<session-config>
    <session-timeout>60</session-timeout>
</session-config>
        (3)session 自杀:安全退出

案例: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<Book> list =(ArrayList<Book>) session.getAttribute("books");
        //判断list集合是否为空
        if (list == null){
            //为空,则是第一次请求
            //创建集合 把得到的book对象封装起来
            ArrayList<Book> 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" %>
<html>
<head>
    <title>书本展示</title>
</head>
<body>
    <a href="${pageContext.request.contextPath}/shoppingServlet?bookName=西游记&bookPrice=34.98">西游记</a>
    <a href="${pageContext.request.contextPath}/shoppingServlet?bookName=水浒传&bookPrice=45.22">水浒传</a>
    <a href="${pageContext.request.contextPath}/shoppingServlet?bookName=红楼梦&bookPrice=43.54">红楼梦</a>
    <a href="${pageContext.request.contextPath}/shoppingServlet?bookName=三国演义&bookPrice=53.34">三国演义</a>
    <a href="${pageContext.request.contextPath}/bookList.jsp">加入购物车</a>
</body>
</html>

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" %>
<html>
<head>
    <title>购物车</title>
</head>
<body>
<table>
    <tr>
        <th>编号</th>
        <th>书名</th>
        <th>价格</th>
    </tr>
    <c:forEach items="${books}" var="book" varStatus="s">
    <tr>
        <td>${s.count}</td>
        <td>${book.bookName}</td>
        <td>${book.bookPrice}</td>
    </tr>
    </c:forEach>
</body>
</html>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/537304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端开发需要哪些技术?学前端顺序千万千万不要搞错啦!

宝子们&#xff0c;下午好&#xff0c;之前给大家分享了前端岗位的前景规划&#xff0c;小源看的出来&#xff0c;还是有不少宝子想入行前端的&#xff01; 那除了会面试&#xff0c;还要有充足丰富的知识储备&#xff0c;需要什么技术&#xff0c;怎么样做才能找到高薪工作呢&…

Oracle Profile详解

Profile的作用主要表现在三个方面 1、密码策略 2、对用户所能使用的资源进行管理 3、profile存放在数据字典里面&#xff0c;默认有一个名字为default的profile set linesize 160 set pagesize 30 select resource_name,resource_type,limit from dba_profiles where profile‘…

Node.js 学习系列(四)—— 回调函数

Node.js 异步编程的直接体现就是回调。 异步编程依托于回调来实现&#xff0c;但不能说使用了回调后程序就异步化了。 回调函数在任务完成后就会被调用&#xff0c;Node 使用了大量的回调函数&#xff0c;Node 的所有 API 都支持回调函数。 例如&#xff0c;我们可以一边读取…

ubuntu22.10 ffmpeg-webrtc推拉流srs环境搭建

一、编译ffmpeg-webrtc 二、openssl&#xff0c;opus&#xff0c;x264配置 三、编译srs 四、测试 4.1推流端 4.2拉流端 五、交互与sdp 最近看到杨大佬发的动态&#xff0c;尝鲜体验一下。 一、编译ffmpeg-webrtc ffmpeg-webrtc官网&#xff1a;https://github.com/ossrs/ffmp…

Linux---相关介绍、相关下载、连接Linux系统、虚拟机快照

1. Linux系统相关 内核提供了Linux系统的主要功能&#xff0c;如硬件调度管理的能力。 Linux内核是免费开源的&#xff0c;是由林纳斯托瓦兹在1991年创立并发展至今成为服务器操作系统领域的 核心系统。 内核无法被用户直接使用&#xff0c;需要配合应用程序才能被用户使用…

C++层次遍历(队列结构)

#include <stdio.h> #include <malloc.h> typedef struct ok //树结构 { int data; struct ok *lchild; struct ok *rchild; }bittree; //队列结构 typedef struct d { int head; //头 int tail; //尾 bittree **data; //数组 …

安全狗入选中国网络安全市场全景图多个细项

5月16日&#xff0c;数说安全正式发布《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。作为国内云原生安全领导厂商&#xff0c;安全狗凭借综合且全面的产品与安全实力入选全景图。 数说安全采用科学、遵循市场发展规律且符合客户采购习惯的分类方法…

功能测试4年,5月份被辞退,2023年的功能真的没有出路了

在测试行业摸爬滚打5年&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f; 和IT圈外的同学、朋友聊起自己的工作&#xff0c;往往一说自己是测试&#xff0c;无形中也会被大家轻视&#xff0c;总有人会问你&#xff0c;为啥干测试啊&#xff0c…

纯python统计基于orthofinder得到的系统发育树的关注点位置的树型结构

对于某一个物种或某类物种在整个系统发育树中的位置存在一定争议的情况&#xff0c;使用直系同源基因构建单基因树&#xff0c;并对该物种或该类物种所在结构进行统计是可以对争议起到一定的解决作用的&#xff0c;在此留下全套流程和大家交流。 主要分为几步&#xff1a; 使…

260道网络安全常见面试题汇总(附答案解析+配套资料)

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;所有的资料都整理成了PDF&#xff0c;面试题和答案将会持续更新&#xff0c;因为无论如何也不可能覆盖所有的面试题。 目录 一、渗透测试…

从内网护卫到零信任尖兵:腾讯iOA炼成记

腾讯既是企业产品的服务商又是使用者&#xff0c;很多产品最原始的出发点最早只是为了解决腾讯自身某一个需求&#xff0c;经过不断地发展完善和业务场景锤炼&#xff0c;最终进化成一个成熟的企服产品。本系列文章讲述的是这样一组Made in Tencent故事&#xff0c;这是系列的第…

广西高等教育学会高校教育技术委员会莅临瑞云科技考察交流

2023年3月18日上午11点整&#xff0c;广西高等教育学会高校教育技术专业委员会组织了一批来自广西各院校的专家老师&#xff0c;来到深圳市瑞云科技股份有限公司&#xff08;以下简称瑞云科技&#xff09;参观考察。瑞云科技是一家专注为视觉行业提供垂直云计算服务的公司&…

手敲MyBatis(十一章)-支持注解配置执行SQL

1.前言 这一章节从题目中也看出来我们要支持注解版的增删改查&#xff0c;可以在Mapper层的接口类的方法上写Sql语句&#xff0c;如&#xff1a;Insert&#xff0c;Update&#xff0c;Delete&#xff0c;Select的这几个基础Sql&#xff0c;如下图&#xff0c;这样就不用在Xml里…

2023年好用的设计图制作软件推荐

说到设计图制作软件&#xff0c;设计师当然最关注核心设计功能&#xff0c;包括预加载模板、图像数据库、界面和基本编辑功能。此外&#xff0c;还要考虑设计图制作软件是否可以协同工作。 1.即时设计 即时设计是一款「专业UI设计工具」&#xff0c;不受平台限制&#xff0c;…

Mybatis之介绍及使用

Mybatis介绍 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射&#xff1b; 特点 1.支持自定义SQL、存储过程 2.对原有的JDBC进行了封装&#xff0c;几乎消除了所有JDBC代码&#xff0c;让开发者只需关注SQL本身 3.支持XML和注解配置方式自定完成OR…

有哪些好用的pdf阅读软件?这样查阅不出错

PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种用于文档交换的文件格式。它可以在不同的操作系统、软件和设备上显示相同的文档&#xff0c;因此越来越多的人选择使用PDF文件格式来分享和保存文档。与传统的纸质文档相比&#xff0c;PD…

初识uni-app

初识uni-app&#xff1a;跨平台开发的神器 本文将为大家介绍uni-app&#xff0c;一款强大的跨平台App开发框架。我们将探讨其特点、优势以及如何快速上手开发一个简单的uni-app应用。 1. 什么是uni-app uni-app是由DCloud公司研发的一款基于Vue.js的开源跨平台应用开发框架。使…

客户自助服务:让您的客户自助购买

在我们这个数字优先的世界中&#xff0c;我们已经习惯了即时满足。对于品牌来说&#xff0c;这意味着在近乎即时的时间内为客户的问题提供解决方案和答案。花太长时间&#xff0c;您的客户不会满意。这就是提供客户自助服务可以对您的客户体验和满意度产生重大影响的地方。 当…

【MySQL学习】事务管理(Transaction)

文章目录 一、事务的基本认识1.1 事务的基本概念1.2 事务的基本属性1.3 支持事务的存储引擎 二、为什么要有事务三、事务的基本操作3.1 事务的提交方式3.2 事务的操作案例 四、事务的隔离级别4.1 对事务隔离性的初步理解4.2 四种隔离级别4.3 读未提交&#xff08;Read Uncommit…

我能“C”——初阶结构体

目录 结构体 1.结构体的声明 1.1结构体的基础知识 1.2结构体的声明 1.3结构成员的类型 1.4结构体变量的定义和初始化 2. 结构体成员的访问 3.结构体传参 THE END 结构体 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 1.结构体的声明 1.1结构体的基础知…