JavaEE-Servlet(CookieSession)

news2024/11/27 12:58:43

目录

  • Cookie
    • Cookie从哪里来?
    • Cookie到哪里去?
    • Cookie有啥用?
  • Session
  • Servlet中操作 Cookie 和 Session 的API
    • HttpServletRequest
      • 小案例:模拟实现登录功能
    • HttpServletResponse
    • HttpSession
    • Cookie 类中的相关方法
      • 小案例:上传文件

Cookie

Cookie 是浏览器在本地持久化保存数据的一种机制

Cookie从哪里来?

Cookie时从服务器来的。
服务器在响应会带有Set-Cookie字段,通过这个字段就可以把要保存在浏览器本地的数据给返回回去。

Cookie到哪里去?

后续浏览器访问服务器的时候,就会把当前本地的所有Cookie都通过http请求,给带过去。

Cookie有啥用?

其中一种最典型的应用,就是使用Cookie保存当前用户的登录状态~

在Cookie保存用户身份标识,这样的应用场景中,此时身份标识如何分配,以及身份信息如何存储,都需要服务器的支持的。 – session

Session

Session就是服务器用来实现用户身份区分的一种机制

给当前的用户分配一个sessionId,同时记录下当前用户的一些身份信息(可以自定义)

在这里插入图片描述

Servlet中操作 Cookie 和 Session 的API

HttpServletRequest

在这里插入图片描述
getSession有一个参数,boolean。

如果参数为false,getSession的行为是:
1.读取请求中,cookie里的sessionId。
2.然后在服务器根据sessionId来查询对应的Session对象。
3.如果查到了,就会直接返回这个session对象,如果没查到,返回null

如果参数为true,getSession的行为是:
1.读取请求中,cookie里的sessionId。
2.然后在服务器根据sessionId来查询对应的Session对象。
3.如果查到了,就会直接返回这个session对象
4.如果没查到,就会创建一个Session对象,同时生成一个sessionId
以session为key,Session对象为value,把这个键值对存储到服务器里的一个hash表中。
同时把sessionId以Set-Cookie的方式返回给服务器。

小案例:模拟实现登录功能

首先,提供两个页面:
1.登录页(包含两个输入框,输入用户名密码,还要有一个登录按钮)

点击登录按钮,就会发起一个http请求
服务器处理这个请求就会验证用户名密码
如果用户名密码ok,就会跳转到主页

2.主页,只是单纯的显示出当前用户的用户名(欢迎xxx)

登录页,就是一个单纯的html
还需要写一个Servlet,实现登录时候的用户名密码校验
还要写一个Servlet来生成主页(主页里的内容是动态的,不能光一个html就完了)

LoginServlet

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 {
        //1. 从请求中获取到页面提交的用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
 
        //2. 验证用户名和密码是否正确
        //正常这个操作是要查数据库的,此处为了简单,就直接写成硬编码了
        if("zhangsan".equals(username) && "123".equals(password)) {
            //登录成功
            // 1) 创建一个会话,用户刚登录成功,之前是没有会话的,重新分配个新的会话给用户
            // getSession所做的操作
            // 创建 sessionId 和 一个 HttpSession 对象
            // 把这个两个内容以键值对的形式插入到内存的 哈希表中
            // 把sessionId 通过 Set-Cookie 写到响应中
            HttpSession session = req.getSession(true);
            // 得到 HttpSession对象后,就可以随意的设置"键值对"了
            session.setAttribute("username","zhangsan");
 
            // 2) 让响应重定向到"主页"
            resp.sendRedirect("index");
        }else {
            // 登录失败
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("登录失败,用户名或密码错误!");
        }
    }
}

IndexServlet

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,此处的 session 正式刚才登录页的时候,登录成功的逻辑中创建出来的
        // 此处 参数 写为 false, 表示不新建,如果不存在,就返回null
        HttpSession session = req.getSession(false);
        if(session == null) {
            resp.setStatus(403);
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write("您尚未登录,不能访问主页!");
            return;
        }
        String username = (String)session.getAttribute("username");
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("欢迎来到主页! " + username);
    }
}

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录</title>
</head>
<body>
    <!-- 提交的数据交给 LoginServlet 来处理 -->
    <form action="login" method="post">
        <input type="text" name="username">
        <input type="text" name="password">
        <input type="submit" value="登录">
    </form>
</body>
</html>

HttpServletResponse

在这里插入图片描述

HttpSession

一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息
在这里插入图片描述

Cookie 类中的相关方法

每个 Cookie 对象就是一个键值对.
在这里插入图片描述

1.HTTP 的 Cookie 字段中存储的实际上是多组键值对,每个键值对在 Servlet 中都对应了一个 Cookie 对象
2.通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对
3.通过 HttpServletResonse,addCookie() 可以向响应中添加新的 Cookie 键值对 

小案例:上传文件

在前端搭配form表单, form input type = “file”, 允许通过浏览器选中一个文件,上传给服务器
Servlet 就支持处理这种上传文件的请求,把这个请求到的文件在后端获取到

核心方法:

HttpServletRequest 类方法
在这里插入图片描述

Part 类方法
在这里插入图片描述
uploadServlet

package upload;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
 
@WebServlet("/upload")
@MultipartConfig
public class uploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part part = req.getPart("myfile");
        System.out.println(part.getSubmittedFileName());
        System.out.println(part.getSize());
        System.out.println(part.getContentType());
        part.write("D:/idea/result.jpg");
    }
}

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>上传文件</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="myfile">
    <input type="submit" name="提交">
</form>
</body>
</html>

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

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

相关文章

【深入浅出C#】章节 1:C#入门介绍:C#开发环境的设置和配置

一、环境准备 1.1 安装和配置.NET Core 当配置C#开发环境时&#xff0c;安装.NET Core是一个重要的步骤。以下是安装.NET Core的基本过程&#xff1a; 访问官方网站&#xff1a;打开浏览器&#xff0c;访问.NET Core的官方网站&#xff1a;https://dotnet.microsoft.com/en-u…

【vue】三:核心处理---vue的生命周期

文章目录 1.Vue生命周期的四个阶段&#xff0c;八个钩子2.vue的生命周期图例3. 初始阶段&#xff1a;虚拟DOM生成4. 挂载阶段&#xff1a;真实DOM生成5. 更新阶段&#xff1a;data变化重新渲染6. 销毁阶段&#xff1a;卸载所有&#xff0c;销毁vm 1.Vue生命周期的四个阶段&…

Python+Django人脸识别考勤系统网站

程序示例精选 PythonDjango人脸识别考勤系统网站 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonDjango人脸识别考勤系统网站>>编写代码&#xff0c;代码整洁&#xff0c…

文本分类系统Python,基于深度学习CNN卷积神经网络

一、介绍 文本分类系统&#xff0c;使用Python作为主要开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练&#xff0c;最后得到一个h5格式的本地模型文件&#xff0c;然后采用Django开发网页界面&#xff0c;实现用户在界面中输入一…

I.MX6ull 按键抖动消除

1 按键消抖的原理 其实就是在按键按下以后延时一段时间再 去读取按键值&#xff0c;如果此时按键值还有效那就表示这是一次有效的按键&#xff0c;中间的延时就是消抖的。 延时函数实现 会浪费 CPU 性能&#xff0c;因为延时函数就是空跑。 我们可以借助定时器来实现消抖&…

小程序服务器SSL证书替换,访问小程序异常

小程序最近SSL证书过期&#xff0c;访问小程序errno: 600001, errMsg: “request:fail -102:net::ERR_CONNECTION_REFUSED“。 1.在阿里云申请DV证书&#xff0c; DV证书&#xff1a;域名验证型证书&#xff0c;证书审核方式为通过验证域名所有权即可签发证书。 DV证书只验证…

基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注

从本篇博客正式开始深度学习项目的记录&#xff0c;实例代码只会放通用的代码&#xff0c;数据集和训练数据也是不会全部放出。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集原图获取与标注 基于Yolov5目标检测的物体分类…

【计算机组成原理与体系结构】硬件系统概述

目录 一、计算机的发展 二、计算机的硬件系统 三、硬件的工作原理 四、计算机系统的层次结构 五、计算机的性能指标 一、计算机的发展 第一代计算机&#xff1a;电子管计算机 第一台电子计算机&#xff1a;ENIAC&#xff08;1946&#xff09; 设计目的&#xff1a;计算导弹…

实验篇(7.2) 06. 通过安全隧道访问远端内网服务器 (SSL) ❀ 远程访问

【简介】直接映射服务器到公网&#xff0c;没有验证不安全&#xff1b;通过Web浏览器访问远程内网服务器&#xff0c;有验证也安全&#xff0c;但是支持的协议太少。那有没有即安全&#xff0c;又能支持所有协议的访问方法呢&#xff1f;我们来看看SSL VPN的隧道模式。 实验要求…

基于Yolov5目标检测的物体分类识别及定位(二) -- yolov5运行环境搭建及label格式转换

刚开始跟着网上的教程做&#xff0c;把环境安装错了&#xff0c;后来直接用GitHub的官方教程来安装环境。 地址是yolov5官方团队代码及教程&#xff0c;看readme文件就可以。 系列文章&#xff1a; 基于Yolov5目标检测的物体分类识别及定位&#xff08;一&#xff09; -- 数据集…

【MySQL】一文带你了解表的增删改查 CRUD

文章目录 1. 增加&#xff08;Create&#xff09;1.1 单行插入 全列插入1.2 多行插入 指定列插入 2. 查询&#xff08;Retrieve&#xff09;2.1 全列查询2.2 指定列查询2.3 查询字段为表达式2.4 别名2.5 去重2.6 排序 3. 条件查询&#xff08;Where&#xff09;3.1比较运算符…

【人工智能】— 学习与机器学习、无/有监督学习、强化学习、学习表示

【人工智能】— 学习与机器学习、无/有监督学习、强化学习、学习表示 上一章Bayesian Networks本章&#xff1a;观测学习学习学习元素机器学习概论机器学习对什么有用自动语音识别计算机视觉Information retrieval—信息检索 机器学习机器学习&#xff1a;定义 电子邮件过滤问题…

全志V3S嵌入式驱动开发(gpio输出)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 不管是对mcu&#xff0c;还是对soc来说&#xff0c;gpio肯定是越多越好。但是一个芯片上&#xff0c;它的引脚总是有限的&#xff0c;特别对于非BG…

修改邻接变量-0day漏洞利用原理(6)

大多数情况下,局部变量在栈中的分布是相邻的,但也有可能出于编译优化等需要而有所例外。具体情况我们需要在动态调试中具体对待,这里出于讲述基本原理的目的,可以暂时认为局部变量在栈中是紧挨在一起的。 提供理论基础 下一篇利用:非法的超长密码去修改 bufer 的邻接变量…

支持向量机练习

练习5&#xff1a;支持向量机 介绍 在本练习中&#xff0c;我们将使用支持向量机&#xff08;SVM&#xff09;来构建垃圾邮件分类器。 在开始练习前&#xff0c;需要下载如下的文件进行数据上传&#xff1a; data.tgz -包含本练习中所需要用的数据文件 其中&#xff1a; e…

2. 卷积的经典模型

一、什么是卷积神经网络 卷积神经网络就是含有卷积层的网络。 二、有哪些经典的模型&#xff1f;每一次的技术进步在哪里&#xff1f; 卷积神经网络&#xff08;LeNet&#xff09; LeNet第一次将卷积神经网络推上舞台&#xff0c;通过梯度下降训练卷积神经网络可以达到手写数字…

chatgpt赋能python:Python中取出中间文本的方法

Python中取出中间文本的方法 在Python开发中&#xff0c;我们常常需要从字符串中取出特定位置的文本&#xff0c;例如从一个网页源码中提取出指定的内容。而且&#xff0c;一份好的代码需要清晰易懂、高效可靠。那么&#xff0c;在Python中如何取出中间文本呢&#xff1f;下面…

超详细Redis入门教程——Redis 主从集群(下)

前言 本文小新为大家带来 Redis 主从集群 相关知识&#xff0c;具体内容包括哨兵机制实现&#xff08;包括&#xff1a;哨兵机制简介&#xff0c;Redis 高可用集群搭建&#xff0c;Redis 高可用集群的启动&#xff0c;Sentinel 优化配置&#xff09;&#xff0c;哨兵机制原理&a…

史上最全网络安全面试题汇总

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享一份网络安全工…

vmware创建ubuntu服务器>>(使用xshell)配置连接

目录 引言服务器创建准备镜像创建服务器全过程新建虚拟机选择虚拟机硬件兼容性镜像选择服务器目录名和基础信息设置虚拟机命名和存储位置设置处理器配置内存配置网络选型下一步连续点击启动 服务器配置root用户密码设置root用户切换安装ssh服务并启动vmware-ssh配置链接 xshell…