【Servlet学习六】Cookie 与Session 实现登录与上传文件

news2024/10/7 17:30:18

目录

一、Cookie与Session(掌握)

🌈1、Cookie是什么?

🌈2、Session是什么?

二、代码功能演示

🌈1、实现登录功能(掌握)

🌈2、实现上传文件功能(掌握)

1、目标:实现程序,通过网页上传一张图片到服务器。

2、核心方法总结


一、Cookie与Session(掌握)

🌈1、Cookie是什么?

问题1:为什么会有cookie?

        HTTP协议本身是“无状态”协议,这里的无状态指的是:默认HTTP协议的客户端与服务器之间的通信,和下次之间的通信没有直接关系。但是在实际开发中,很多请求之间是有关联的。比如我现在登录CSDN,登录成功之后来到主页面,当我想要访问该主页面的一个“发布博客”按钮,跳转到新的页面的时候,由于没有记录当前的登录状态,所以每次跳转一个新的页面,就要你不断的进行登录,非常麻烦,所以实际中我们需要在登录一次成功之后,就将这个登录信息记录下来,当第二次访问的时候服务器就知道该请求是否已经登录过了。由于HTTP不支持,所以通过Cookie和Session来解决HTTP无状态的问题。(之前的博文中有提到)

 图中的 "令牌" 通常就存储在 Cookie 字段中。

问题2:cookie是什么?

Cookie是客户端保存数据的一种机制,一个典型的应用场景是保存用户的登录信息。

🌈2、Session是什么?

问题1:为什么会有Session?

(1) Cookie是工作在浏览器端,Session工作在服务器端,两者都是用来保存某一个数据的。Session的主要作用是用于识别是哪一个用户(会话)访问了服务器。

(2)由于服务器在同一时刻收到的请求是非常多的,所以服务器需要清楚的知道目前的这个请求是来自于哪个用户的,所以在前面给用户令牌的时候,服务器这边也要记录下每个用户令牌以及用户信息的对应关系。

(3)要存储这个对应关系,因此Session本质就是通过一个“哈希表”来存储的,key值记录令牌的Id(可以叫做token/sessionId),这个Id是服务器端生成的一个“唯一性字符串”,value就是用户信息,底层也是一个HashMap。(用户信息可以根据需求灵活设计)。

(4)如果删除了本地的cookie之后,再访问该网站就会变为未登录状态。        

 

 问题2:理解Cookie与Session的整个过程?

 (1)当用户登录时,服务器在Session中新增一条记录,并将SessionId返回给客户端;

(2)客户端后续再给服务器端发送请求的时候,需要在请求中带上sessionId. (例如通过 HTTP 请求中的 Cookie 字段带上);

(3)服务器收到请求之后,根据请求中的sessionId在Session信息中获取到对应的用户信息,再进行后续操作。

 举个例子:

        到了医院看病,在挂号的时候(类比于第一次访问服务器)要求提供身份证(进行登录),然后医院会返回给你一个“就诊卡”,然后在医院这边会在系统库中记录下每个就诊卡和用户之间的关系,用户将“就诊卡”收好( 服务器返回给浏览器一个“令牌”,浏览器这边将令牌收好),之后再去各个科室进行检查等,就不用再出示身份证了,只要凭借“就诊卡”,医院这边在自己的信息库里面查询就可以识别出当前用户的身份(之后再进行其他操作,就不用再进行登录了,因为已经记录了登录的信息)。


二、代码功能演示

🌈1、实现登录功能(掌握)

(1)HTML文件:login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <!-- API接口的URL,method中写的是请求的方法:POST,GET,表单提交的时候一般都是POST -->
    <form action="login" method="post">
        <!-- 使用表单提交的时候,一定要有name属性,相应标签的值会和name属性中设置的内容拼接成key value的形式提交到服务器 -->
        <input type = "text" name="username">        
        <input type = "text" name="password">
        <button type="submit">登录</button>
    </form>
</body>
</html>

(2)后端代码:LoginInServlet.java与indexServlet .java

@WebServlet("/login")
public class LoginInServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //String username
        //String password
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset = utf-8");
        //2、获取参数
        String username = req.getParameter("username");//username和前端的name的值对应
        String password = req.getParameter("password");
        //3、校验
        if(username == null || !username.equals("zhangsan") ||
            password == null || !password.equals("123456")){
            resp.getWriter().write("请输入正确的用户名和密码");
            return;
        }
        //4、登录成功,保存用户的信息到Session中(跳转到另一个界面)
        //(1)获取Session
        //传入True:表示第一次登录的时候(访问后端的时候),创建一个Session
        HttpSession session = req.getSession(true);
        //(2)将当前用户信息保存到Session中,每次操作的时候都会查找cookie中是否有session信息,
        session.setAttribute("userInfo",username);
        //(3)跳转到payServlet的地址
        resp.sendRedirect("index");
    }
}
@WebServlet("/index")
public class indexServlet extends HttpServlet {
    //获取当前用户Session
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //2、获取当前用户的session:
        HttpSession session = req.getSession(false);
        //3、判断当前用户是否登录
        if(session == null){
            resp.getWriter().write("没有登录,请重新登录");
            return;
        }
        //4、说明已经登录了,判断用户存不存在
        //获取当前登录的用户对象
        String username = (String) session.getAttribute("userInfo");
        //判断该对象名是否正确
        if(username == null || username.equals("")){
            resp.getWriter().write("没有找到用户信息,请重新登录");
            return;
        }
        //否则:登录成功,页面上显示用户名
        resp.getWriter().write("欢迎回来"+username);
    }
}

(3)功能演示

response.sendRedirect()实现重定向(页面跳转)_智慧浩海的博客-CSDN博客

(1)不输入任何内容,给出提示

 

 (2)输入错误的用户名或者密码,给出提示

 

(3)输入正确的用户名或者密码

 

🌈2、实现上传文件功能(掌握)

1、目标:实现程序,通过网页上传一张图片到服务器。

(1)HTML文件: upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
    <form action="upload" method="post" enctype="multipart/form-data">
      <input type="file" name="uploadFile">
      <button type="submit">提交</button>
    </form>
</body>
</html>

(2)后端代码:Demo1_upload.java

@WebServlet("/upload")
//注意:要加这个注解
@MultipartConfig
public class Demo1_upload extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、设置编码格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html,charset=utf-8");
        //2、获取上传的文件:注意这里用req.getPart()获取文件,而不是getParameter(),它获取的是String类型
        Part file = req.getPart("uploadFile");
        //3、获取文件信息
        System.out.println("文件名是"+file.getSubmittedFileName());
        System.out.println("文件类型是"+file.getContentType());
        System.out.println("文件大小是"+file.getSize());
        //4、将文件写入指定的磁盘中
        file.write("d:/"+file.getSubmittedFileName());
        //5、返回响应
        resp.getWriter().write("文件上传成功"+file.getSubmittedFileName());
    }
}

注意点:

(1)前端:

(2)后端:

  • 需要给 UploadServlet 加上 @MultipartConfig 注解,否则服务器代码无法使用 getPart 方法。
  • Part类,用于获取上传的文件。
  • getPart 的参数 需要和 form 中 input 标签的 name 属性对应;
  • 客户端一次可以提交多个文件, (使用多个 input 标签),此时服务器可以通过 getParts 获取所有的Part 对象。

效果:

(3)最终效果

(1)选择文件

(2)点击提交按钮

 (3) 在d盘可以找见上传的文件:

2、核心方法总结

(1)HttpServletRequest 类方法

方法描述
Part getPart(String name)获取请求中给定 name 的文件

Collection<Part> getParts()

获取所有的文件

(2)Part 类方法

方法描述
String getSubmittedFileName()获取提交的文件名
String getContentType()获取提交的文件类型
long getSize()获取文件的大小
void write(String path)把提交的文件数据写入磁盘文件

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

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

相关文章

基于深度学习的高精度扑克牌检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度扑克牌检测识别系统可用于日常生活中或野外来检测与定位扑克牌目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的扑克牌目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

打造专属个人模型-私有独立离线模型部署-阿里云GPU服务器配置

阿里云有免费的机器学习 GPU 服务器&#xff0c;免费试用活动页https://free.aliyun.com只要没有申请过 PAI-DSW 资源的新老用户皆可申请 5000CU 的免费额度&#xff0c;3个月内使用。 选择第一个进行立即试用 可以看到试用的界面 如果遇到下面的错误&#xff0c;当前账号没有权…

【跳棋】跳棋游戏-多人游戏-微信小程序开发流程详解

看到跳棋游戏&#xff0c;一个2到6人可一起玩的游戏&#xff0c;于是联想起&#xff0c;自己上小学时候陪同学们玩过的弹珠游戏&#xff0c;是不是跟跳棋游戏很像呢&#xff0c;看了跳棋玩法&#xff0c;有兴趣就研究&#xff0c;这里把跳棋游戏给弄出来了&#xff0c;想知道地…

com.alibaba.druid.pool.DruidDataSource报错(显示红色)

springbootAlibaba项目,application.yml配置如下&#xff1a; 圈中的地方报错&#xff0c;pom.xml也引入了druid依赖,如图&#xff1a; 最后改为&#xff1a; 解决。

Halcon学习之一维测量(2)

在Halcon学习之一维测量(1)文章中,我们介绍了直线测量中的基于边缘对的,还有一种是不基于边缘对的,而是基于边缘的。 接下来讲解就以,Halcon自带的例子,芯片pin引脚测量为例子,主要测量引脚的数量,引脚的平均宽度,还有引脚之间的距离: 源码: * Pin Measurement…

攻防世界-Crypto-Normal_RSA

题目描述&#xff1a;下载附件后&#xff0c;附件中只有两个文件&#xff0c;一个是加密后的密钥&#xff0c;一个是公钥文件 背景知识&#xff1a;RSA加密算法 现在相当于给出了密文和公钥&#xff0c;需要我们去求解明文 1. 思路分析 既然要解密&#xff0c;那么必须要获取…

【数据结构与算法】树和二叉树练习题(选择填空)

【数据结构与算法】树和二叉树练习题&#xff1a;选择填空类型 Ⅰ.知前序和中序推理后序Ⅱ.知后序和中序推理前序Ⅲ.深度/广度遍历Ⅳ.通过遍历推理树的形状Ⅴ.树节点问题 Ⅰ.知前序和中序推理后序 题目名称&#xff1a; 1.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff…

ChatGPT实战:项目管理

人工智能有可能彻底改变许多行业&#xff0c;包括项目管理&#xff0c;及时了解最新技术以及它如何影响你的工作至关重要&#xff0c;因为学习好项目管理&#xff0c;不管你能不能做项目经理&#xff0c;在生活、工作的方面方面都会享受到懂得项目管理后带来的收益。 下面我们借…

np.averag的运算规则

今天写代码的时候&#xff0c;计算加权平均&#xff0c;一直没有搞懂np.average是怎么运算的&#xff0c;做个笔记记录一下&#xff1a; 创建一个&#xff08;3,4,5&#xff09;维度的np数组&#xff0c;然后在创建一个[1,0.5,1]的权重数组&#xff0c;计算他们的加权平均&…

Spring Boot Actuator实现应用监控

1、Spring Boot Actuator实现应用监控 前面的例子中&#xff0c;我们学习的都是 Prometheus 自身的内容&#xff0c;即监控的都是机器或者系统层面的指标。那么如果我 们需要对 Java 应用做监控&#xff0c;例如&#xff1a;监控 JVM 的信息&#xff0c;监控 Spring Bean 的信…

如何实现多 Tab 同步登陆和退出

一. 场景再现 前两天接到一个需求&#xff0c;要求实现类似于 B站 的那种&#xff0c;当我同时打开多个 Tab 标签的时候&#xff0c;如果我在某一个窗口退出了&#xff0c;那么其它窗口的登陆状态也需要同步退出。如下图&#xff0c;我同时打开了两个 tab 。 当我点击其中一个…

【Java】SpringBoot项目中resource目录下有多个配置文件,如何指定某个特定的配置文件生效?

在我们开发项目的时候&#xff0c;会有多个开发环境&#xff0c;比如测试环境&#xff0c;生产环境&#xff0c;开发环境&#xff0c;产品环境等环境&#xff0c;如下 怎么多的配置文件&#xff0c;那么哪一个配置文件会生效&#xff1f;我们如何指定我们需要的配置文件&…

调用office的Excel制作统计图,并保存成图片

public class CMSChart{private Chart chart;public CMSChart(Chart chart){this.chart chart;}/// <summary>/// 保存图片/// </summary>/// <param name"fullPicName"></param>public void SaveAs(string fullPicName){ChartImageFormat …

VMware 虚拟机安装 CentOS 8

一、准备 演示过程使用的软件版本如下&#xff1a; VMware 16.2.5 build-20904516 CentOS 8.5.2111-x86_64-dvd1.iso VMware 下载安装请参考&#xff1a;VMware16.x 下载与安装 CentOS 镜像下载请参考&#xff1a;CentOS 各版本镜像下载 VMware 15 及以下版本&#xff0c;不支…

nginx部署本地项目如何让异地公网访问?服务器端口映射配置!

接触过IIS或apache的小伙伴们&#xff0c;对nginx是比较容易理解的&#xff0c;nginx有点类似&#xff0c;又有所差异&#xff0c;在选择使用时根据自己本地应用场景来部署使用即可。通过一些对比可能会更加清楚了解&#xff1a; 1.nginx是轻量级&#xff0c;比apache占用更少…

C# 多数元素

169 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&…

FPGA USB FX2 数据回环试验 驱动CY7C68013A实现 提供工程源码和技术支持

目录 1、前言2、我这儿已有的 FPGA USB 通信方案3、CY7C68013A芯片解读和硬件设计FX2 简介SlaveFIFO模式及其配置 4、工程详细设计方案5、vivado工程6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 目前USB2.0的实现方案很多&#xff0c;但就简单好用的角度而言&a…

kkfileview部署使用

1.gitee下载源码 kkFileView: 使用spring boot打造文件文档在线预览项目解决方案&#xff0c;支持doc、docx、ppt、pptx、wps、xls、xlsx、zip、rar、ofd、xmind、bpmn 、eml 、epub、3ds、dwg、psd 、mp4、mp3以及众多类文本类型文件在线预览 2.去掉cad 3.替换水印字体为免费…

php宝塔搭建好用的二次元图系统php源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。本期给大家带来一套好用的二次元图系统php源码。抽时间看了一下&#xff0c;功能还是不错的&#xff0c;有参考价值。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcnetos7以…

德国汽车行业杂志HANSERautomotive就浪潮信息算法团队在自动驾驶领域所取得的核心突破,进行专题署名报道

近日&#xff0c;德国专业汽车行业杂志HANSERautomotive就浪潮信息算法团队在自动驾驶领域所取得的核心突破&#xff0c;进行专题署名文章报道“Wahrnehmungssysteme und 3D-Objekterkennung Alles im Blick ”(《感知系统和三维物体识别&#xff0c;一切尽收眼底》)。针对AI感…