Servlet(Cookie和Session)

news2025/7/14 5:36:06

目录

🐲 1. Cookie 的工作流程

🐲 2. Servlet中操作 Cookie 和 Session 的api

🐲 3. 案例1: 模拟登录

🐲 4. 上传文件

🐲 5. 案例2: 上传文件


🐲 1. Cookie 的工作流程

Cookie 是浏览器在本地持久化保存数据的一种方案,

具体可以看我这一篇博客第6.6中: HTTP(http+抓包Fiddler+协议格式+请求+响应)

它的一种典型的使用方式: 存储登录信息

登录过程中,它的工作流程是这样的 

Cookie 是在浏览器中工作的

Session 是在服务器中工作的


在 Servlet 中也提供了相关的 API, 让我们来操作 Cookie 和 Session

🐲 2. Servlet中操作 Cookie 和 Session 的api

HttpServletRequest 类的相关方法

方法描述
HttpServlet  getSession()

在服务器中获取会话,

Cookie[]  getCookies()

返回一个数组,包含客户端发送该请求的所有的 Cookie 对象

会自动把 Cookie 中的格式解析成键值对

HttpServletResponse  类的相关方法

方法描述
void  addCookie(Cookie cookie)

返回响应, 想给浏览器返回哪些 cookie, 

都可以通过这个方法来添加

(在这里添加的键值对,都会体现在 HTTP 响应报文的 SetCookie 字段上)

HttpSession 类中的相关方法

一个 HttpSession 对象中包含多个键值对, 我们可以给 HttpSession 中保存任何我们需要的信息

方法描述
Object  getAttribute(String name)

返回在该 session 会话中具有指定名称的对象,

如果没有指定名称的对象,返回 null

void  setAttribute(String name, Object value)该使用指定的名称绑定一个对象到该 session 会话
boolean  isNew()判定当前是否是新创建出的会话

Cookie 类中的相关方法   

每个 Cookie 对象是一个键值对

方法描述
String  getName()

返回 cookie 的名称.名称在创建后不能改变,

(这个值是 Set-Cookie 字段设置给浏览器的)

String  getValue()获取与 cookie 关联的值
void  setValue(String newValue)设置与 cookie 关联的值

(1) HTTP 的 Cookie 字段中存储的实际上是多组键值对,每个键值对在 Servlet 中都对应了一个 Cookie 对象

(2) 通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对

(3) 通过 HttpServletResonse,addCookie() 可以向响应中添加新的 Cookie 键值对 


🐲 3. 案例1: 模拟登录

具体应该考虑这几个方面

(1) 登录页面,用户可以填写用户名+密码

(2) Servlet 来处理登录请求

(3) 使用另一个 Servlet 来生成主页内容(登录成功后,跳转到的页面)

 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;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28463
 * Date: 2022—11—24
 * Time: 8:37
 */
// 使用这个类来处理登录请求
@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;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28463
 * Date: 2022—11—24
 * Time: 8:38
 */
//登录成功后, 跳转到的主页
@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>

🐲 4. 上传文件

在前端搭配form表单, form input type = "file", 允许通过浏览器选中一个文件,上传给服务器

Servlet 就支持处理这种上传文件的请求,把这个请求到的文件在后端获取到

HttpServletRequest 类方法

方法描述
part  getPart(String name)

获取请求中给定 name 的文件

input标签的 name 属性(就和 getParameter 类似的);

Part 表示一个文件,一次上传,可以包含多个文件

(可以有多个 input type = "file") 每个文件都是一个 Part 对象

Collection<Part> getParts()获取所有的文件

Part 类方法

方法描述
String getSubmittedFileName()获取提交的文件名
String  getContentType()获取提交的文件类型
long  getSize()获取文件的大小
void  write(String path)

把提交的文件数据写入磁盘文件

(保存到服务器的本地路径)

🐲 5. 案例2: 上传文件

 

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;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 28463
 * Date: 2022—11—24
 * Time: 10:27
 */
@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/tmp/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/36563.html

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

相关文章

[附源码]SSM计算机毕业设计朋辈帮扶系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[毕业设计]opencv机器学习双目测距精度测量系统

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

Flutter高仿微信-第43篇-群聊列表

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** Author : wangning* Email : maoning20080809163.c…

泰克Tektronix 信号发生器AFG31022 ,2频道,25MHz

AFG31022 泰克函数发生器 AFG31022 是 Tektronix 的 25 MHz 函数发生器。 产品特征&#xff1a; 2个频道 25 MHz 正弦波 输出幅度范围&#xff1a;1 mVP-P 至 10 VP-P&#xff0c;50 Ω 负载 14 位垂直分辨率 内置波形包括正弦波、方波、斜波、脉冲、噪声和其他常用波形…

数据库设计规范

一、概述 系统数据库表的设计如果有问题&#xff0c;可能造成数据冗余、信息重复、存储空间浪费、数据插入更新异常等。设计一个好的数据表可尽量避免上述问题的发生&#xff0c;如何设计一个好的数据库是有一定的规范的。而这些设计表的基本原则规范称为范式 二、范式 1、范…

实战渗透--一次对后台登录系统的简单渗透测试

某网站后台登录界面 发现有验证码框 猜想会不会存在验证码绕过的漏洞 首先随意输入用户名密码&#xff08;用于抓包&#xff09; 打开burp抓包 分析数据包后 找到对应的传参点 即输入的账号密码还有验证码 这里可以看到 账号和密码全都是明文传输 并没有进行加密 所以更改起来还…

【微服务】CORS跨越问题网关请求转发时进行路径重写问题

一、跨域 CORS 简述 跨域官方文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS 浏览器跨越问题的英文简写为CORS&#xff0c;其出现问题的截图如下&#xff1a; 浏览器拒绝跨域&#xff0c;是通过同源策略限制的。同源策略是指&#xff0c;发送请求…

文献学习03_GloVe: Global Vectors for Word Representation_20221124

论文信息 Subjects:《2014年自然语言处理经验方法会议论文集》&#xff08;EMNLP&#xff09;&#xff0c;第1532–1543页&#xff0c;2014年10月25日至29日&#xff0c; &#xff08;1&#xff09;题目&#xff1a;GloVe: Global Vectors for Word Representation &#xff0…

本地GitLab服务器搭建

一、简介 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。安装方法是参考GitLab在GitHub上的Wiki页面。Gitlab是被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过…

把握性能测试重点,5步解决问题!

一、引言 很多做性能测试的同学都问过我这样一个问题&#xff1a;鱼哥(Carl_奕然)&#xff0c;你说性能测试的重点是什么? 我的回答很简单&#xff1a;瓶颈分析与问题定位。 在性能项目的整个周期&#xff0c;不管是脚本设计&#xff0c;脚本编写还是脚本执行&#xff0c;都…

什么时候可以用到强化学习?强化学习怎么用?

我相信很多像我一样的初学者在学习强化学习的的过程会有一种困惑&#xff1a;强化学习内容搞懂了&#xff0c;算法流程也明白了&#xff0c;但是怎么用在自己的研究领域或者应用上呢&#xff1f;换句话说&#xff0c;什么样的情况可以用强化学习解决呢&#xff1f; 什么是强化…

基于MxNet实现目标检测-CenterNet【附部分源码及模型】

文章目录前言目标检测发展史及意义一、数据集的准备1.标注工具的安装2.数据集的准备3.标注数据4.解释xml文件的内容二、网络结构的介绍三、代码实现0.工程目录结构如下1.导入库2.配置GPU/CPU环境3.数据加载器4.模型构建5.模型训练1.学习率设置2.优化器设置3.损失设置4.循环训练…

24.java- File类的常用方法:遍历目录里的文件

遍历目录 通过遍历目录可以在指定的目录中查找文件&#xff0c;或者显示所有的文件列表。 1.File 类的 list() File 类的 list() 方法提供了遍历目录功能&#xff0c;该方法有如下两种重载形式。 String[] list() 该方法表示返回由 File 对象表示目录中所有文件和子目录名称…

Hive之内部表外部表和分区表分桶表

Hive系列 第七章 内部表外部表和分区表分桶表 7.1 内部表和外部表 7.1.1 内部表和外部表的区别 1、创建的时候外部表加上external 2、删除表的时候&#xff0c;内部表会删除元数据信息和真实数据信息&#xff0c;外部表只会删除描述信息7.1.2 内部表和外部表的应用场景 1、…

【JAVA高级】——Druid连接池和Apache的DBUtils使用

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;JAVA开发者…

HBase查询一张表的数据条数的方法

HBase查询一张表的数据条数的方法 文章目录HBase查询一张表的数据条数的方法0、写在前面1、HBase-Shell的count命令2、Scan操作获取数据条数3、执行Mapreduce任务4、Hive与HBase整合5、协处理器Coprocessor实现6、参考资料0、写在前面 Linux版本&#xff1a;Ubuntu Kylin 16.0…

国网云(华为组件)使用

一、国网云(华为组件)介绍 一、项目各项环境 各项环境的介绍 MRS-Hive:MRS支持在大数据存储量大,计算资源需要弹性扩展的场景下,用户将数据存储在OBS服务中。使用MRS集群仅做数据计算处理的存算分离模式。DWS(高斯200):云原生数据库Gauss DB(DWS)1:融合分析能力是云原…

分布式计算模型Mapreduce实践与原理剖析(二)

第二章 MapReduce核心组件实战 2.1 MapReduce中分区组件 需求&#xff1a;根据单词的长度给单词出现的次数的结果存储到不同文件中&#xff0c;以便于在快速查询 思路&#xff1a; 1、定义Mapper逻辑 2、定义Reducer逻辑 3、自定义分区Partitioner这个案例主要的逻辑在这个…

【kafka】一、kafka介绍

kafka概述 定义 kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要应用于大数据实时处理领域。 消息队列 1&#xff09;解耦 允许你独立的扩展或修改两边的处理过程&#xff0c;只要确保它们遵守同样的接口约束。 2&#xff09;可恢复性 系统的一部分组件…

java EE初阶 —进程与线程的区别

文章目录1.为什么会引入进程和线程的概念2.进程和线程的关系2.1 坤坤吃鸡演示进程和线程区别2.1.1 线程的安全问题2.1.2 线程的异常问题1.为什么会引入进程和线程的概念 引入进程这个概念&#xff0c;最主要的目的是为了解决并发编程这样的问题。 CPU 已经进入了多核心的时代&…