cookie和session—javaEE

news2024/10/5 19:27:24

1.cookie

1.1定义

单纯的说cookie指的是cookie技术,是客户端保存数据的一种技术

1.2保存的方式

(1)客户端写js代码
(2)服务端返回响应头set-cookie字段的值让客户端保存在本地硬盘或浏览器的相关路径中

1.3作用

每次请求浏览器都自动携带该网站的cookie信息

2.session

2.1背景

http是一种无状态的协议(http是一发一收的短连接就断开连接),也就是应用层没有保存连接状态,登录后,下一次访问,基于http协议本身是不知道是哪个用户

解决方案一:每次请求都携带账号和密码,每次服务端都验证(不安全且存在冗余问题)
解决方案二:会话管理(cookie+session)

2.2标识一个会话

登录之后,超时且注销之前都属于一个会话

2.3定义

服务端保存数据的一种技术

3.会话管理

不同的上下文语义,会话的含义是不同的,web开发中,会话是用户登录一个网站以后,退出或超时之前都是鼠疫一个会话

3.1实现原理

基于cookie和session

3.2流程

(1)登录时,验证账号密码成功:服务端创建session会话并保存在服务端;返回响应头set-cookie:sessionId=xxx
(2)客户端保存cookie:把sessionId保存在客户端本地
(3)客户端每次请求浏览器都会自动携带cookie请求头信息(sessionId)
(4)服务端验证session:服务端通过sessionId找到对应的session以及其中保存的用户信息

举个栗子:类似于上超市办理会员卡(登录),就会有对于的会员卡号(sessionId),下次再去购物,携带会员卡就行(就能通过会员卡的会员卡号找到对于的用户信息)

4.servlet中使用session进行会话管理

4.1HttpServletRequset类中的相关方法

HttpSession getSession(boolean create) 在服务器中获取会话,参数为true,如果当前会话不存在就创建一个会话(用于登录成功);参数为false,如果当前会话不存在就返回null(用于返回敏感资源)

4.2HttpSession类中的相关方法

一个HttpSession对象里面包含多个键值对,可以往HttpSession中存放任何需要的信息

Object getAttribute(String name) 返回在该session会话中具有指定名称的对象,如果没有就返回null

void setAttribute(String name, Object value) 使用指定的名称绑定一个对象到该session会话

void invalidate() 失效,注销的时候使用

4.3会话管理的代码实现

(1)登录功能:验证账号密码,创建session并保存用户信息
前端代码:

<!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>
    <label for="username">用户名</label>
    <input type="text" id="username" placeholder="请输入账号">
    <br>
    <label for="password">密码</label>
    <input type="password" id="password" placeholder="请输入账号">
    <br>
    <input type="button" value="登录" onclick="login()">
    <br>
    <script src="ajax.js"></script>
    <script>
        var username = document.querySelector("#username");
        var password = document.querySelector("#password");
        function login(){
            if(!username.value){
                alert("请输入账号:");
                return;
            }
            if(!password.value){
                alert("请输入密码:");
                return;
            }
            ajax({
                method: "POST",
                url: "login",
                contentType:"application/json",
                body: JSON.stringify({
                    username: username.value,
                    password: password.value
                }),
                callback(status,resp){
                    if(status == 200){
                        //转换响应正文的JSON字符串为JSON对象
                        var body = JSON.parse(resp);
                        if(body.ok){//登录成功
                            location.href = "sensitive.html";
                        }else{//登录失败
                            alert("登录失败:" + body.msg);
                        }
                    }else{
                        alert("状态码:"+status);
                    }
                }
            });
        }
    </script>
</body>
</html>

后端代码:

package org.example.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/login")
public class loginServlet extends HelloServlet{
    private static final ObjectMapper m = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        // 反序列化:家那个JSON字符串转化为java对象
        User user = m.readValue(req.getInputStream(),User.class);
        // 将验证的结果映射到map对象中,再转换为JSON字符串返回给客户端
        Map<String,Object> map = new HashMap<>();
        // 模拟验证账号和密码
        if ("abc".equals(user.getUsername()) && "123".equals(user.getPassword())){
            map.put("ok",true);
            // 创建一个session用户对话,本身是获取session,传入true,如果获取不到就会创建一个
            HttpSession session = req.getSession(true);
            // 使用session会话来保存一些用户信息
            session.setAttribute("user",user);
        }else {
            map.put("ok",false);
            map.put("msg","账号或密码错误");
        }
        // 返回响应,设置编码格式和数据格式
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json");
        resp.getWriter().write(m.writeValueAsString(map));
    }
}

(2)敏感资源,验证session
前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>敏感资源</title>
</head>
<body>
    <ul></ul>
    <script src="ajax.js"></script>
    <script>
        var ul = document.querySelector("ul");
        // 会话管理:没有登录不允许访问
        ajax({
            method: "GET",
            url: "sensitive",
            callback: function(status,resp){
                if(status == 200){//登录成功
                    var body = JSON.parse(resp);
                    var content = "";
                    content += `<li>键a:${body.a}</li>`
                    content += `<li>键b:${body.b}</li>`
                    content += `<li>键c:${body.c}</li>`
                    ul.innerHTML = content;
                }else{
                    alert("响应状态码:"+status);
                }
            }
        });
    </script>
</body>
</html>

后端代码:

package org.example.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;

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;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/sensitive")
public class sensitive extends HttpServlet {
    private static final ObjectMapper m = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //验证用户身份:获取session并且获取不到不能创建;验证session和其中的user
        HttpSession session = req.getSession(false);
        if (session != null){
            User user = (User)session.getAttribute("user");//这里的user要和登录保存的一致
            if (user != null){//用户已成功登录
                //返回一些数据
                Map<Object,Object> map = new HashMap<>();
                map.put("a","abc");
                map.put("b","def");
                map.put("c",false);
                resp.setContentType("application/json");
                resp.setContentType("UTF-8");
                resp.getWriter().write(m.writeValueAsString(map));
                return;
            }
        }
        //其他情况返回401状态码
        resp.setStatus(401);
    }
}

登录失败:
在这里插入图片描述
在这里插入图片描述
登录成功:
在这里插入图片描述

在这里插入图片描述
直接访问:
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Oracle的学习心得和知识总结(二十三)|Oracle数据库Real Application Testing之Database Replay相关视图

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

[C++]模板初阶与STL简介

目录 模板初阶与STL简介&#xff1a;&#xff1a; 1.泛型编程 2.函数模板 3.类模板 4.什么是STL 5.STL的版本 6.STL的六大组件 7.STL的缺陷 模板初阶与STL简介&#xff1a;&#xff1a; 1.泛型编程 如何实现一个通用的交换函数呢? void Swap(int& left, int& righ…

《Netty》从零开始学netty源码(四十二)之PoolChunk.runsAvailMap

runsAvailMap PoolChunk中的runsAvailMap属性用于存放可用的run的信息&#xff0c;PoolChunk中每一次分配内存都会更新runsAvailMap中可用的run的起始信息及末尾信息&#xff0c;先看下它的数据结构&#xff1a; 我们看下它的构造函数是如何赋值的&#xff1a; PoolChunk的默认…

为什么MySQL索引更适合B+树而不是二叉树、B树

概述&#xff1a; 在当今社会&#xff0c;程序员内卷非常的严重&#xff0c;如果没有过硬的技术&#xff0c;很难在众多的程序员中脱颖而出&#xff0c;例如&#xff0c;以前问数据库方面的知识&#xff0c;只会问些增删改查语句表面的东西&#xff0c;而如今却要问数据库底层…

【翻译一下官方文档】之uniapp的网络请求

uni.request(OBJECT) 发起网络请求。 参数名类型必填默认值说明平台差异说明urlString是开发者服务器接口地址dataObject/String/ArrayBuffer否请求的参数App 3.3.7 以下不支持 ArrayBuffer 类型headerObject否设置请求的 header&#xff0c;header 中不能设置 RefererApp、H5…

关于链表的题目—leetcode

第一题&#xff1a;删除链表中的指定节点 问题描述&#xff1a; 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点…

【redis】缓存预热雪崩穿透击穿

【redis】缓存预热雪崩穿透击穿&#xff08;上&#xff09; 文章目录 【redis】缓存预热雪崩穿透击穿&#xff08;上&#xff09;前言一、面试题二、缓存预热三、缓存雪崩发生原因预防&#xff0b;解决高可用&#xff1a;多缓存结合&#xff1a; 人民币玩家 四、缓存穿透是什么…

谷歌云端硬盘Drive批量下载大文件或大文件夹的稳定方法

本文介绍在谷歌云端硬盘&#xff08;Drive&#xff09;中&#xff0c;快速、稳定下载大文件、文件夹的方法。 在使用谷歌Drive下载文件或文件夹时&#xff0c;我们往往会遇到下载不稳定或失败的情况&#xff1b;在下载较大的文件或文件夹时&#xff0c;这一问题出现的频率更多。…

NLP语义识别在人工智能领域中的应用与前景

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中的一个重要分支&#xff0c;它致力于让计算机能够理解并处理人类自然语言。语义识别是NLP中的一个重要技术&#xff0c;它可以使计算机更好地理解人类语言的含义和意图。在本文中&#xff0c;我们将探讨NLP语义识别在人…

4月24号软件更新资讯合集.....

GoFrame v2.4 版本发布&#xff0c;企业级 Golang 开发框架 大家好啊&#xff0c;GoFrame 框架今天发布了 v2.4.0 正式版本啦&#xff01;&#x1f44f;&#x1f44f;&#x1f44f;&#x1f44f; 该版本最大的亮点在于提供了微服务开发的功能特性、开发工具以及工程脚手架&am…

第三章作业:关系数据库

第三章作业&#xff1a;关系数据库 目录 第三章作业&#xff1a;关系数据库选择题简答题1、关系代数&#xff1a;产生学生成绩表&#xff0c;包括学号、姓名、课程名、学分和成绩。题目代码 2、关系代数&#xff1a;检索选择了课程号为“C2"的学生学号和姓名。题目代码 3、…

月获2万份简历,硕士占比超70%!中欧基金如何破圈打造雇主品牌?

成立于2006年的中欧基金&#xff0c;作为国内首批实现员工持股的基金公司&#xff0c;坚持以人为本&#xff0c;相信优秀的业绩要靠优秀的人才来创造。 因此&#xff0c;中欧基金在完善公司治理机制基础上&#xff0c;实现不仅有敢打硬仗能打胜仗的将才&#xff0c;还有更多不…

Pytorch损失函数

基本用法 criterion LossCriterion() #构造函数有自己的参数loss criterion(x, y) #调用标准时也有参数 1 L1范数损失 L1Loss 计算 output 和 target 之差的绝对值。 torch.nn.L1Loss(reductionmean)参数&#xff1a; reduction-三个值 none: 不使用约简&#xff1b; me…

S32K系列MCU学习介绍

前言 最近因为工作需要&#xff0c;在学习恩智浦的S32K312&#xff0c;开发一款汽车PDU。 一、S32K3系列 1.特点 S32K系列是恩智浦公司于2017年推出的面向汽车电子的微控制器。S32K3 系列包括基于 Arm Cortex-M7 的 MCU&#xff0c;采用单步、双步和锁步内核配置&#xff0…

滴水逆向3期笔记与作业——01汇编

防止OneNote丢失。 海哥牛逼。 01汇编笔记 01进制进制定义10-2进制转换八进制 02数据宽度/逻辑运算数据宽度与存储逻辑运算计算机做加法的本质作业 03通用寄存器_内存读写通用寄存器表通用寄存器图内存读写计算机操作系统位数意义 04内存地址_堆栈寻址公式PUSH指令POP指令作业 …

《稻》念袁老,孙溟㠭先生为纪念袁隆平老先生治印一方

孙溟㠭篆刻作品《稻》 孙溟㠭篆刻作品《稻》 稻穗熟了&#xff0c;袁老走了。溟㠭先生为纪念袁隆平老先生而治印一枚。 拓印左侧禾苗繁茂&#xff0c;稻田里蛙声一片。拓印右侧为袁老的样子&#xff0c;人瘦心厚&#xff0c;顶着烈日&#xff0c;照料自己试验的稻田。袁老一…

3.黑马springboot开发篇自己修改笔记

SpringBoot开发实用篇 ​ KF-1.热部署 ​ 什么是热部署&#xff1f;简单说就是你程序改了&#xff0c;现在要重新启动服务器&#xff0c;嫌麻烦&#xff1f;不用重启&#xff0c;服务器会自己悄悄的把更新后的程序给重新加载一遍&#xff0c;这就是热部署。 ​ 热部署的功能…

[渗透教程]-017-入侵检测与社交网络安全

文章目录 1.入侵检测1.1 入侵检测基本概念1.2 入侵艰难侧系统评估指标1.3 入侵检测基本技术1.4 通用入侵检测框架2.社交网络安全1.入侵检测 1.1 入侵检测基本概念 入侵检测(Intrusion Detection),指对系统的运行状态进行监视,发现各种攻击企图、攻击行为或者攻击结果,以保证…

大神们分享STM32的学习方法

单片机用处这么广&#xff0c;尤其是STM32生态这么火&#xff01;如何快速上手学习呢&#xff1f; 第一&#xff1a;你要考虑的是&#xff0c;要用STM32实现什么 为什么使用STM32而不是8051? 是因为51的频率太低&#xff0c;无法满足计算需求?是51的管脚太少&#xff0c;无法…

MySQL单表操作

二、数据的新增、修改、删除 1.回顾ishop的数据表 mysql> use ishop; Database changed mysql> show tables; ----------------- | Tables_in_ishop | ----------------- | commodity | | commoditytype | | customer | | order | ----------…