当前位置: 首页 > news >正文

Servlet开发-session和cookie理解案例-登录页面

项目展示

        进入登录页面,输入正确的用户名和密码以后会自动跳到主页

        登录成功以后打印用户名以及上次登录的时间,如果浏览器和客户端都保存有上次登录的信息,则不需要登录就可以进入主页        

编码思路

        1.首先提供一个登录的前端页面,用户进入登录页面,输入用户名和密码,根据用户名和密码发送一个post类型的HTTP请求给服务器

        2.服务器接收到HTTP请求以后,验证用户名和密码是否正确,如果正确,则在服务器中为该用户创建一个会话session,session中包含的键值对有用户的用户名和用户登录的时间,服务器把创建session产生的唯一的JSESSIONID通过HTTP响应发送给浏览器,浏览器将JSESSIONID保存到Cookie中(下次发送HTTP请求会携带着Cookie中的内容)

        3.会话创建成功以后,服务器会向浏览器发送一个重定向的HTTP响应,让浏览器发送一个访问主页的gei类型的HTTP请求,这样服务器就会向浏览器发送主页的HTTP响应,就达到了登录成功以后自动跳转到主页的效果

代码及其解析

        1.首先编写前端代码,让用户输入用户名和密码,发送一个POST类型的HTTP请求(携带着用户名和密码)给服务器

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录页面</title>
</head>
<body><!-- 通过from表单构造http请求 --><form action="login" method="post"><input type="text" name="username"><input type="password" name="password"><input type="submit" value="登录"></form>
</body>
</html>

        2.编写登录逻辑的后端代码,解析已经写在了代码中,推荐复制到idea中查看

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: wuyulin* Date: 2023-09-28* Time: 8:08*/
//登录
@WebServlet("/login")
public class LoginServlet extends HttpServlet {//客户会输入用户名和密码,通过post类型的HTTP请求发送给服务器@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取用户名和密码//由于登录的HTTP请求是通过from表单构造发送的,所以是键值对结构的数据,通过getParameter方法便可以通过key值获得value值String username=req.getParameter("username");String password=req.getParameter("password");//检查用户名和密码是否符合要求if(username==null||password==null||username.equals("")||password.equals("")){//用户名和密码不符合要求,给用户返回HTTP响应做出提醒resp.setContentType("text/html; charset=utf8");resp.getWriter().write("用户名和密码不符合要求");return;}//验证用户名和密码是否正确//正常来说,客户的用户名和密码会保存到数据库中//验证用户名和密码会先在数据库中查找用户名是否存在,然后再检验密码是否正确//但现在简单实现的话,就约定用户名username=“zhangsan”,密码password=“123”//用户名错误if(!username.equals("zhangsan")){resp.setContentType("text/html; charset=utf8");resp.getWriter().write("用户名错误");return;}//密码错误if(!password.equals("123")){resp.setContentType("text/html; charset=utf8");resp.getWriter().write("密码错误");return;}//用户名和密码没有错误就登陆成功,可以给用户创建会话(session)//getSession背后做的事情://1.先读取req中的Cookie,看Cookie中是否有JSESSIONID属性,以及值是什么//  如果没有,就认为需要创建一个session并生成一个唯一的JSESSIONID//  如果有,就会拿着这个JSESSIONID去查询服务器中是否有对应的session存在//      要是session存在就会返回这个session//      要是session不存在就会创建一个session并生成一个唯一的JSESSIONID//2.当前是第一次进行登录操作的话HTTP请求的cookie中就肯定没有JSESSIONID,就会创建一个session并生成一个唯一的JSESSIONID//以JSESSIONID为key,session为value,把这个键值对插入到服务器存储session的哈希表中//3.刚才生成的JSESSIONID又会通过addCookie方法添加到HTTP响应中,此时HTTP响应就会带有Set-Cookie字段//这里的值就是JSESSIONID=xxxxxxx,通过HTTP响应传递浏览器,浏览器通过cookie保存这个JSESSIONID,之后发送的HTTP请求就会带着这个JSESSIONIDHttpSession session=req.getSession(true);//session中其实就是一些程序猿自定义的键值对//向session中传入一些键值对session.setAttribute("username",username);session.setAttribute("time",System.currentTimeMillis());//会话创建完毕,用户登录成功,自动从登录页面跳转到主页(发送重定向响应给客户端)//此处约定主页的路径是indexresp.sendRedirect("index");}
}

        3.主页的后端代码

        该案例中并没有专门为主页创建一个HTML页面,直接通过后端代码发送字符串表示即可

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: wuyulin* Date: 2023-09-28* Time: 10:19*///通过Servlet生成一个主页
@WebServlet("/index")
public class IndexServlet extends HttpServlet {//用户登录成功收到一个重定向的HTTP响应以后就会发送一个get类型的HTTP请求给服务器,请求获取index路径的http响应@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//验证用户的登录状态//当HTTP请求的Cookie中有JSESSIONID的话就根据JSESSIONID找到对应的session//要是没有JSESSIONID或者通过JSESSIONID找不到对应的session就直接返回nullHttpSession session=req.getSession(false);//用户没有登录if(session==null){//返回HTTP响应提醒用户登录resp.setContentType("text/html; charset=utf8");resp.getWriter().write("请先登录再来访问主页");return;}//用户已经登录成功//就可以取出session中的attribute//getAttribute方法可以通过key值获取到Attribute中的value值,但返回的类型是Object,所以要进行强转String username=(String) session.getAttribute("username");Long time=(Long) session.getAttribute("time");//获取到session中的username和time以后,根据相关内容构造主页即可resp.setContentType("text/html; charset=utf8");resp.getWriter().write("欢迎"+username+"! "+"上次登录时间为"+time);}
}

核心-session与cookie的交互过程

        1.首先,当用户是第一次登录时,发送给服务器的HTTP请求的中就没有Cookie(没有JSESSIONID),要是用户直接访问主页的话,服务器会先检查HTTP请求有没有Cookie属性,要是没有就会直接拒绝用户的访问,提醒用户先进行登录,要是有Cookie就会取出其中的JSESSIONID去浏览器中查找对应的session,要是没有找到的话也会直接拒绝用户的访问

        2.用户登录成功以后,服务器就会为用户创建一个对应的会话(session),并生成一个唯一的JSESSIONID,将JSESSIONID为key,session为value的键值对保存到服务器类似于哈希表的数据结构中,并将JSESSIONID通过HTTP响应发送给浏览器,浏览器就会保存这个JSESSIONID到Cookie中,下次发送HTTP请求的时候会带上Cookie中的内容

        3.此时要是用户退出网站,重新尝试获取主页信息的时候,发送的HTTP请求中就会带有Cookie,服务器收到HTTP请求以后就会检查Cookie中的JSESSIONID,通过JSESSIONID在服务器中找到对应的session,获得用户的相关信息(如本例中就获得了用户的用户名以及上次登录的时间),此时就不需要用户输入用户名和密码,直接通过HTTP响应返回主页的内容给浏览器

        以上的大部分操作在getSession方法中进行,可以看代码中的注释进行了解

相关文章:

Servlet开发-session和cookie理解案例-登录页面

项目展示 进入登录页面&#xff0c;输入正确的用户名和密码以后会自动跳到主页 登录成功以后打印用户名以及上次登录的时间&#xff0c;如果浏览器和客户端都保存有上次登录的信息&#xff0c;则不需要登录就可以进入主页 编码思路 1.首先提供一个登录的前端页面&…...

Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

1. 引言 Polygon Miden定位为zkVM&#xff0c;定于2023年Q4上公开测试网。 zk、zkVM、zkEVM及其未来中指出&#xff0c;当前主要有3种类型的zkVM&#xff0c;括号内为其相应的指令集&#xff1a; mainstream&#xff08;WASM, RISC-V&#xff09;EVM&#xff08;EVM bytecod…...

[题]宝物筛选 #单调队列优化

五、宝物筛选&#xff08;洛谷P1776&#xff09; 题目链接 好家伙&#xff0c;找到了一个之前学习多重背包优化时的错误…… 之前记的笔记还是很有用的…… #include<bits/stdc.h> using namespace std; const int N 1e5 10; int f[N]; int n, m; int v, w, s; int l…...

.NET的键盘Hook管理类,用于禁用键盘输入和切换

一、MyHook帮助类 此类需要编写指定屏蔽的按键&#xff0c;灵活性差。 using System; using System.Runtime.InteropServices; using System.Diagnostics; using System.Windows.Forms; using Microsoft.Win32;namespace MyHookClass {/// <summary>/// 类一/// </su…...

Anaconda Jupyter

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言An…...

Unity中Shader的前向渲染路径ForwardRenderingPath

文章目录 前言一、前向渲染路径的特点二、渲染方式1、逐像素(效果最好)2、逐顶点(效果次之)3、SH球谐(效果最差) 三、Unity中对灯光设置 后&#xff0c;自动选择对应的渲染方式1、ForwardBase仅用于一个逐像素的平行灯&#xff0c;以及所有的逐顶点与SH2、ForwardAdd用于其他所…...

简历项目优化关键方法论-START

START方法论是非常著名的面试法则&#xff0c;经常被面试官使用的工具 Situation:情况、事情、项目需求是在什么情况下发生Task:任务&#xff0c;你负责的做的是什么Action:动作&#xff0c;针对这样的情况分析&#xff0c;你采用了什么行动方式Result:结果&#xff0c;在这样…...

TensorFlow学习1:使用官方模型进行图片分类

前言 人工智能以后会越来越发达&#xff0c;趁着现在简单学习一下。机器学习框架有很多&#xff0c;这里觉得学习谷歌的 TensorFlow&#xff0c;谷歌的技术还是很有保证的&#xff0c;另外TensorFlow 的中文文档真的很友好。 文档&#xff1a; https://tensorflow.google.cn/…...

C++ 并发编程实战 第八章 设计并发代码 一

目录 8.1 在线程间切分任务 8.1.1 先在线程间切分数据&#xff0c;再开始处理 8.1.2 以递归方式划分数据 8.1.3 依据工作类别划分任务 借多线程分离关注点需防范两大风险 在线程间按流程划分任务 8.2 影响并发性能的因素 8.2.1 处理器的数量 8.2.2 数据竞争和缓存兵乓…...

设计模式8、装饰者模式 Decorator

解释说明&#xff1a;动态地给一个对象增加一些额外的职责。就扩展功能而言&#xff0c;装饰模式提供了一种比使用子类更加灵活的替代方案 抽象构件&#xff08;Component&#xff09;&#xff1a;定义一个抽象接口以规范准备收附加责任的对象 具体构件&#xff08;ConcreteCom…...

抖音开放平台第三方代小程序开发,一整套流程

大家好&#xff0c;我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题&#xff0c;一套模板&#xff0c;随处部署。能尽可能地减少服务商的开发成本&#xff0c;服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…...

Flutter笔记:滚动之-无限滚动与动态加载的实现(GetX简单状态管理版)

Flutter笔记 无限滚动与动态加载的实现&#xff08;GeX简单状态管理版&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq…...

前端架构师之02_ES6_高级

1 类和继承 1.1 class类 JavaScript 语言中&#xff0c;生成实例对象的传统方法是通过构造函数。 // ES5 创建对象 // 创建一个类&#xff0c;用户名 密码 function User(name,pass){// 添加属性this.name name;this.pass pass; } // 用 原型 添加方法 User.prototype.sho…...

VScode多文件编译/调试配置

之前都是在Visual Studio写C/C&#xff0c;最近想换到VScode&#xff0c;折腾半天把launch.json和tasks.json配好了&#xff08;虽然不懂为什么&#xff0c;但确实能用了&#xff09;&#xff0c;在此做个记录。 参考资料&#xff1a;1&#xff0c;2&#xff0c;3 环境&#…...

K折交叉验证——cross_val_score函数使用说明

在机器学习中&#xff0c;许多算法中多个超参数&#xff0c;超参数的取值不同会导致结果差异很大&#xff0c;如何确定最优的超参数&#xff1f;此时就需要进行交叉验证的方法&#xff0c;sklearn给我们提供了相应的cross_val_score函数&#xff0c;可对数据集进行交叉验证划分…...

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题&#xff0c;并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…...

React简介

react作为前端主流框架之一&#xff0c;因其语法接近原生JavaScript语法而广受欢迎。其生态丰富&#xff0c;常用的就有react-router、react-redux等插件&#xff0c;还有与其匹配的UI组件库antd。而且其还有用于移动端开发的react-native库&#xff0c;因此&#xff0c;react值…...

链表经典面试题(一)

面试题 1.反转链表的题目2.反转链表的图文分析3.反转链表的代码实现 1.反转链表的题目 2.反转链表的图文分析 我们在实现反转链表的时候,是将后面的元素变前面&#xff0c;前面的元素变后面&#xff0c;那么我们是否可以理解为&#xff0c;用头插法的思想来完成反转链表呢&…...

体验亚马逊的 CodeWhisperer 感觉

CodeWhisperer 是亚马逊推出的辅助编程工具&#xff0c;在程序员写代码时&#xff0c;它能根据其内容生成多种代码建议。 CodeWhisperer 目前已支持近10几种语言&#xff0c;我是用 java 语言&#xff0c;用的开发工具是 idea&#xff0c;说一下我用的情况。 亚马逊云科技开发…...

6、行内元素和块元素

6、行内元素和块元素 一、块元素 无论内容多少&#xff0c;该元素独占一行 如p标签、标题标签&#xff08;h1-h6…&#xff09; 二、行内元素 内容撑开宽度、左右都是行内元素的可以排在一行 一些元素如果能够摆放在一行都可以用行内元素&#xff0c;但是如果需要换行就需…...

LeetCode 面试题 08.01. 三步问题

文章目录 一、题目二、Java 题解 一、题目 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模1000000007。 示例1: 输入&…...

[CSCCTF 2019 Qual]FlaskLight 过滤 url_for globals 绕过globals过滤

目录 subprocess.Popen FILE warnings.catch_warnings site._Printer 这题很明显就是 SSTI了 源代码 我们试试看 {{7*7}} 然后我们就开始吧 原本我的想法是直接{{url_for.__globals__}} 但是回显是直接500 猜测过滤 我们正常来吧 {{"".__class__}} 查看当前…...

1分钟快速实现Redis数据对比

在上篇「Redis高效、安全的不停机数据迁移方案」的文章中&#xff0c;介绍了NineData在Redis迁移场景下的性能和优势。因为数据在主备、多云和多区域环境之间的迁移流动&#xff0c;难免会产生数据一致性的问题&#xff0c;而结构与数据不一致往往是导致故障的原因之一。所以&a…...

ASUS华硕天选4笔记本电脑FX507VV原厂Windows11系统

下载链接&#xff1a;https://pan.baidu.com/s/1W9tedHI3iFjaHju5eLkQ6g?pwd8dl2 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、华硕电脑管家、奥创控制中心等预装程序 由于时间关系,绝大部分资料没有上传&#xff0c;不是想要的型号&#xff0c;请联系客服获取。...

Vue3配置路由

文章目录 一、创建index.js二、main.js的配置三、在App.vue中引入 一、创建index.js 在src文件夹中创建router文件夹&#xff0c;并在其中创建index.js文件 //引入路由对象 import { createRouter,createWebHistory } from vue-router import PufMac from "../views/puf…...

力扣 -- 97. 交错字符串

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:bool isInterleave(string s1, string s2, string s3) {int ms1.size();int ns2.size();//先判断s1的长度s2的长度是否等于s3的长度&#xff0c;如果不等&#xff0c;则s1和s2不可能拼接成s3if(mn!s3.size…...

【剑指Offer】4.二维数组中的查找

题目 在一个二维数组array中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的一个二维数组和一个整数&#xff0c;判断数组中是否含有该…...

独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位——“51单片机”

各位CSDN的uu们你们好呀&#xff0c;今天依旧是小雅兰的51单片机的内容&#xff0c;内容主要是&#xff1a;独立按键控制LED亮灭、独立按键控制LED状态、独立按键控制LED显示二进制、独立按键控制LED移位&#xff0c;下面&#xff0c;让我们进入51单片机的世界吧&#xff01;&a…...

chrome extensions mv3通过content scripts注入/获取原网站的window数据

开发插件的都知道插件的content scripts和top window只共享Dom不共享window和其他数据&#xff0c;如果想拿挂载在window的数据还有点难度&#xff0c;下面会通过事件的方式传递cs和top window之间的数据写一个例子 代码 manifest.json 这里只搞了2个js&#xff0c;content.…...

震坤行API接口聚合解析,实现根据ID取商品详情

震坤行是一个工业品服务平台&#xff0c;提供了API接口供开发者使用。要根据ID获取商品详情&#xff0c;您需要使用震坤行API接口并进行相应的请求。 以下是使用震坤行API接口根据ID获取商品详情的示例代码&#xff08;使用Python编写&#xff09;&#xff1a; import reques…...

长春长春网站建设网/英文seo是什么意思

如果在window系统的cmd命令行中执行 telnet 命令&#xff0c;遇到上图的报错时&#xff0c;可能您没有开启 telnet 功能&#xff0c;下面教大家开启此功能&#xff1a; 1、打开控制面板&#xff0c;然后进入到 “程序” 里面&#xff1a; 2、点击 “启用或关闭Windows功能”&…...

成人学设计应该去哪里学/优化seo方法

我们将要做一个用于展示手机官方站点的简单手机webapp程序。这个App包括一个主页&#xff0c;联系页面和一个博客页面。博客页面列出官方最近发表的一些文章并且可以通过手机设备进行查看文章信息。 这里展示一下实际要完成的效果图&#xff1a; 程序启动 第一件事情就是启动我…...

网站建设 网络科技/免费二级域名分发网站源码

咸鱼CAD笔记—编辑工具移动工具旋转工具修剪延伸工具删除及复制工具镜像工具倒圆角工具分解工具拉伸工具缩放工具倒角工具矩形阵列路径及环形阵列偏移工具编辑工具简单介绍&#xff0c;后期实战的时候遇到哪个在详解移动工具 &#xff08;1&#xff09;快捷键&#xff1a;M &a…...

深圳建设工程造价管理站/百度论坛

2019独角兽企业重金招聘Python工程师标准>>> 10 月 23 日&#xff0c;EGO 北京分会会员、PingCAP 联合创始人兼 CTO 黄东旭作为 EGO 线上分享第二季嘉宾&#xff0c;与超过 400 位 EGO 会员交流了自己在开源软件和创业方面的感悟。本文为根据口述内容整理的实录。 口…...

政府电子商务网站有哪些/seo知识点

此文中所提到的面试题是园子中Tony Qu兄弟翻译过来的&#xff0c;特此感谢NET牛人应该知道些什么&#xff1f; &#xff08;本答复不是标准答案&#xff0c;敬请兄弟们补充更正&#xff0c;不胜感激&#xff09; 任何一个使用.NET的人 1) 描述线程与进程的区别&#xff1f; 线程…...

关于做电商网站导流项目/哈尔滨百度公司地址

钉钉相关功能介入开发系列一&#xff1a;获取access_token 企业微信获取access_token...