JavaWeb之会话跟踪技术

前言

这一节主要讲会话跟踪技术

1.补充

在这里插入图片描述
为了提交Gitee我修改了模块的目录,就是移动了模块,导致模块不是Maven了,可以在右边的Maven小工具,点加号,把模块重新添加为Maven

2. 概述

在这里插入图片描述

3. Cookie

3.1 基本使用

在这里插入图片描述

在这里插入图片描述

        //发送cookie//1.创建cookie对象Cookie cookie=new Cookie("username","zs");//2.发送response.addCookie(cookie);

在这里插入图片描述
怎么看cookie来的数据呢,
在这里插入图片描述
点设置
在这里插入图片描述
点第三个
在这里插入图片描述
在这里插入图片描述
搜localhost
在这里插入图片描述
或者用开发者模式也可以

在这里插入图片描述

        //获取cookie//1.获取cookie数组Cookie[] cookies = request.getCookies();//2.遍历数组for (Cookie cookie : cookies) {//3.获取数据String name = cookie.getName();if("username".equals(name)){String value = cookie.getValue();//但我只想要username和zs的cookieSystem.out.println(name+":"+value);break;}}

在这里插入图片描述
在这里插入图片描述
先访问aServlet,这样浏览器就有cookie了,在访问bCookie
在这里插入图片描述
在这里插入图片描述
这样的话,一次会话(一个浏览器)两次请求(两个窗口)之间共享了数据
对于我们,我们只需要干,发送和获取

3.2 原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在访问bServlet,浏览器里面已经有cookie信息了,那么访问的时候就会把cookie里面的数据携带到bServlet里面的资源里面去
在这里插入图片描述
在这里插入图片描述
这个就是cookie的请求头,而且cookie对应数据不止一个,因为浏览器会把这个域名下的locallhost下的所有cookie都带过去

3.3 使用细节

在这里插入图片描述
这个的意思就是你使用aServlet,然后关闭浏览器,cookie就不见了。在打开bServlet,就不会有输出了
但是我们记住密码,肯定有记住一个月啊,要多记住一些时间,就不能浏览器关闭,cookie就不见了
在这里插入图片描述

        cookie.setMaxAge(60*60*24*7);

在这里插入图片描述
在这里插入图片描述
这样的话,就算我们关闭浏览器也不会删除cookie了,再次点开bServlet也可以访问cookie了
现在我们演示一下存储中文

        Cookie cookie=new Cookie("username","张三");

在这里插入图片描述
在这里插入图片描述
这样直接就报错了

        String value="张三";//URL编码value = URLEncoder.encode(value, "UTF-8");System.out.println(value);Cookie cookie = new Cookie("username", value);

在这里插入图片描述

在这里插入图片描述

这样bServlet获取的数据就是URL编码的数据了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样的话,我们需要解码

                value = URLDecoder.decode(value, "UTF-8");

在这里插入图片描述
在这里插入图片描述

4. Session

4.1 基本使用

在这里插入图片描述

        //存储到Session中//1.获取session对象HttpSession session = request.getSession();//2.存储数据session.setAttribute("username","sz");//第二个参数为任意类型

在这里插入图片描述

        //获取数据,从session中//1.获取session对象,这个对象只有一个HttpSession session = request.getSession();//2.获取数据Object username = session.getAttribute("username");System.out.println(username);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 原理

两次获取的session是同一个,不信可以打印一下地址,分别打印一下
在这里插入图片描述
请求1和请求2是同一会话,就是同一session,请求3和请求1不是同一会话,就不是同一个session
其实session就是一个cookie,往sessio存入数据,就是存入cookie
在这里插入图片描述

创建了一个cookie这个cookie就是JESSIONID,值就是对应id,id就是服务端session的唯一标识,不同会话有不同的id
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就有id

4.3 使用细节

在这里插入图片描述
一般来说,还是存在的,因为万一你买了什么东西,离开了一下,资源就直接不见了?
在这里插入图片描述
在这里插入图片描述
然后终端ctrl+c,正常停止

在这里插入图片描述
再次启动

在这里插入图片描述
在这里插入图片描述
这样就看出来,还是存在的
在这里插入图片描述
那在哪里看这个文件呢
在这里插入图片描述
里面有tomcat–》work–》找
在这里插入图片描述
这里就有了
在启动的时候,这个文件就被删除了
浏览器关闭的话,访问的session就不是同一个session了
在这里插入图片描述

  <session-config>
<!--    这里就表示session失效时间是100分钟,默认是就是30分钟--><session-timeout>100</session-timeout></session-config>

在这里插入图片描述
所以很长一段时间没有操作就会退出登录,30分钟

        //销毁session.invalidate();//自己把自己销毁了

在这里插入图片描述
在这里插入图片描述
这里先demo1,在demo2,就会报错了

5.小结

在这里插入图片描述

购物车用cookie
登录信息就要存在cookie,但是不安全,但是可以长期存
验证码用session

5. 案例

在这里插入图片描述
我们要实现的功能就是,登录的时候,账号和密码错误,会提示错误,点了记住我,下次就不用输入密码了
注册的时候,验证码错误也会提示,账号已存在也会提示,验证码不区分大小写

5.1 登录

在这里插入图片描述
在这里插入图片描述
补充一下:下载这个插件,我们的Mapper就有小鸟了

在这里插入图片描述
现在我们导入User,UserMapper,还有对应xml
以前写过的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
下面写services层:

        //2.获取sqlSessionSqlSession sqlsession = factory.openSession();//3.获取UserMapperUserMapper mapper = sqlsession.getMapper(UserMapper.class);//4.调用方法User user=mapper.select(username,password);sqlsession.close();

在这里插入图片描述

web:
前端的页面直接就拷贝了
资源在
资源
不知道能不能打开
在这里插入图片描述
这四个全拷贝到webapp下
在这里插入图片描述
但是要显示动态的数据的话,我们要改造成jsp
把login.html的代码全部粘贴到login.jsp中
在这里插入图片描述
LoginServlet:
在这里插入图片描述
brand.jsp:

<h1>${user.username},欢迎您</h1>

在这里插入图片描述
但是user要共享数据(多个页面,多个servlet间)—》存在cookie或者session里面—》session–》因为要安全

            //存储sessionHttpSession session = request.getSession();session.setAttribute("user", user);

在这里插入图片描述
现在开始写登录失败
跳转到login.jsp–》要显示登录失败的提示—》要携带用户名和密码----》数据存在request域中,采用转发的方式

            //2.登录失败//存储错误信息到requestrequest.setAttribute("login_msg","用户名或密码错误");//跳转到login.jsprequest.getRequestDispatcher("/login.jsp").forward(request, response);

在这里插入图片描述
login.jsp:

        <div id="errorMsg">${login_msg}</div>

在这里插入图片描述
然后就是我们的数据库里面也有表的
在这里插入图片描述
在这里插入图片描述
先随便输
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登录失败的信息只和那一次请求有关系,如果存在session中,那么就会在那一次会话多次请求中一直存在,只是在login.jsp显示一下就可以了
,存在request域中就可以了
登录成功的信息存在session中,方便后期再每一个页面都能访问到对应用户名的信息,user只有一个,每一次登录都会替代原来session的user

5.2 记住用户

在这里插入图片描述
登录成功且勾选了就写cookie
在这里插入图片描述

login.jsp:

        <p>Remember:<input id="remember" name="remember" value="1" type="checkbox"></p>

在这里插入图片描述
看值是不是1就知道勾没勾选了
LoginServlet:

        //获取复选框数据String remember = request.getParameter("remember");
            //判断用户是否勾选记住我if("1".equals(remember)){//因为万一remember为空呢//勾选了,发送cookie//1.创建---》用户名和密码两个cookieCookie c_username = new Cookie("username",username);Cookie c_password = new Cookie("password",password);//设置存活值--》一周c_username.setMaxAge(60*60*24*7);c_password.setMaxAge(60*60*24*7);//2.发送response.addCookie(c_username);response.addCookie(c_password);}

在这里插入图片描述
写cookie我们就做完了

先写个错误密码–》不会有cookie
在这里插入图片描述
在这里插入图片描述
有个小问题就是这个是get请求,待会儿改

在这里插入图片描述
这里没有cookie
在这里插入图片描述
在这里插入图片描述
也没有cookie
在这里插入图片描述
现在我们正确登录就有cookie了
在这里插入图片描述
这里还有过期时间

在login.jsp上获取cookie
在这里插入图片描述
login.jsp:

        <p>Username:<input id="username" name="username" value="${cookie.username.value}" type="text"></p><p>Password:<input id="password" name="password"  value="${cookie.password.value}" type="password"></p>

在这里插入图片描述
在这里插入图片描述
这里我们一刷新就填上了

5.3 注册案例

在这里插入图片描述
在这里插入图片描述
services:
UserService:
在这里插入图片描述
web:
register.html:
因为要动态生成数据,所以要写成jsp
直接复制过去就可以了

    <form id="reg-form" action="/brand-demo/registerServlet" method="post">

在这里插入图片描述
RegisterServlet:
在这里插入图片描述
register.jsp:

                    <span id="username_err" class="err_msg" style="display: none">${register_msg}</span>

在这里插入图片描述
login.jsp:

        <div id="errorMsg">${login_msg} ${register_msg}</div>

在这里插入图片描述
login.jsp:

            <a href="register.jsp">没有账号?</a>

在这里插入图片描述
在这里插入图片描述
左下角有提示,点没有账号
在这里插入图片描述
在这里插入图片描述
但是这个没有展示注册信息
原因可能是register_msg写错了,然后可能就是span给隐藏掉了
在这里插入图片描述
点击style的三个点可以发现,display==none
删掉style就可以了

                    <span id="username_err" class="err_msg">${register_msg}</span>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 验证码之展示和验证

在这里插入图片描述
在这里插入图片描述
我们在资料里面复制一个工具类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们只需要管这一个函数就可以了
在这个工具类里面写一个测试方法

    public static void main(String[] args) throws Exception {OutputStream fos=new FileOutputStream("d://a.jpg");String s = CheckCodeUtil.outputVerifyImage(100, 50, fos, 4);//返回的字符串就是验证码数据System.out.println(s);}

在这里插入图片描述
在这里插入图片描述
控制台输出的这个数据,就是验证码NRCR
然后d盘对应有一个图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为图片机器是无法识别的,只有人来用肉眼观察,才能注册
register.jsp:
在这里插入图片描述
中的
在这里插入图片描述
这个是写死的
将来我们是要访问一个动态的资源,而且每一次访问都会获取到一个新的图片

                    <img src="/brand-demo/checkCodeServlet">

将来就是我访问这个Servlet,这个Servlet就返回一个图片的数据,就放在了这个img的src里边,就获取到了验证码
CheckCodeServlet:

//        OutputStream fos=new FileOutputStream("d://a.jpg");//这个流换一下,换成response的字节输出流ServletOutputStream os = response.getOutputStream();String s = CheckCodeUtil.outputVerifyImage(100, 50, os, 4);//返回的字符串就是验证码数据

写这一行代码就可以把图片输出到验证码的位置了

在这里插入图片描述
它的作用就是提供验证码
在这里插入图片描述
没刷新一次,验证码就换一次
在这里插入图片描述
下面我们来做第二个功能,就是看不清,换一张
给看不清添加一个单击事件就可以了
register.jsp:
在这里插入图片描述
或者写一个JavaScript的代码

在这里插入图片描述
接下来我们需要干的事就是获取对应图片,取个id
在这里插入图片描述

<script>document.getElementById("changeImg").onclick = function() {document.getElementById("checkCodeImg").src = "/brand-demo/checkCodeServlet";}
</script>

在这里插入图片描述
这样就可以了
在这里插入图片描述
但是我们点了看不清还是没换,为什么呢,原因就是这个图片的路径已经被缓存了

在这里插入图片描述
在这里插入图片描述
因为这两个路径是一模一样的,所以这个图片就被浏览器缓存了,解决办法就是给script加个参数就可以了

<script>document.getElementById("changeImg").onclick = function() {document.getElementById("checkCodeImg").src = "/brand-demo/checkCodeServlet?a";}
</script>

在这里插入图片描述
在这里插入图片描述
但是这样还是不能一直换,因为带有参数a的图片又被浏览器缓存了

<script>document.getElementById("changeImg").onclick = function() {document.getElementById("checkCodeImge").src = "/brand-demo/checkCodeServlet?a";}
</script>

注意我的ID少写了一个e,但还是只能刷新一次,原因一样的,被缓存了,但为了是个单词,后面我又去掉了e

所以在后面加个永远不一样的数据-》时间–》因为时间一去不复返

<script>document.getElementById("changeImg").onclick = function() {// new Date().getMilliseconds();获取时间的毫秒值document.getElementById("checkCodeImg").src = "/brand-demo/checkCodeServlet?"+new Date().getMilliseconds();}
</script>

在这里插入图片描述

这样就可以了,这样我们真的就可以一直换了

在这里插入图片描述
填写验证码一样就注册,不一样就阻止注册
用户填写的用户数据,可以通过request获取,在注册的servlet获取
但验证码图片生成的数据,访问的是CheckCodeServlet,是一次新的请求,怎么共享呢,在一次会话的两次请求之间,用cookie或者session
又因为验证码要安全,所以存session
在这里插入图片描述
CheckCodeServlet:

        //存入sessionHttpSession session = request.getSession();session.setAttribute("checkCodeGen", checkCode);

在这里插入图片描述
RegisterServlet:

        //获取用户输入的验证码
//                    <tr>
//                <td>验证码</td>
//                <td class="inputs">
//                    <input name="checkCode" type="text" id="checkCode">
//                    <img id="checkCodeImg" src="/brand-demo/checkCodeServlet">
//                    <a href="#" id="changeImg">看不清?</a>//验证码的名字叫做checkCodeString checkCode = request.getParameter("checkCode");//获取程序生成的验证码,从Session中获取HttpSession session = request.getSession();//        session.setAttribute("checkCodeGen", checkCode);String checkCodeGen = (String)session.getAttribute("checkCodeGen");//要对应起来

在这里插入图片描述
接下来就来比对验证码
是要在注册service之前比对,之后在比对的话,都已经注册进去了

        //比对if(!checkCodeGen.equalsIgnoreCase(checkCode)){//因为程序生成的不可能为null,因为要忽略大小写比对,所以我们用这个equalsIgnoreCase//不允许注册//注册失败,跳转到注册页面request.setAttribute("register_msg","验证码错误");request.getRequestDispatcher("/register.jsp").forward(request, response);return;}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

显示出来了验证码错误,还重新生成了验证码

在这里插入图片描述
在这里插入图片描述

总结

这个会话跟踪技术我们就讲完了,主要精彩的部分就是后面的案例了,前面的比较枯燥
Gitee

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

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

相关文章

第二十周周报:回顾篇

目录 摘要 Abstract 1 深度学习基础知识 1.1 学习率 1.1.1 自适应学习率 1.1.2 学习率调度 1.2 归一化 1.2.1 批量归一化 1.2.2 特征归一化 1.3 激活函数 1.3.1 Sigmoid函数 1.3.2 Tanh函数 1.3.3 ReLU函数 1.3.4 Leak ReLU函数 1.3.5 PReLU函数 1.3.6 ELU函数…

智能化SCRM方案助力企业高效管理与营销转型

内容概要 现代企业面临着复杂多变的市场环境&#xff0c;传统的管理与营销方式常常无法满足日益增长的需求。这时&#xff0c;智能化SCRM方案便应运而生&#xff0c;为企业带来了新的机遇与挑战。智能化SCRM方案不仅仅是一个单一的工具&#xff0c;它更像是一个全面的解决方案…

PRD2012学习笔记

图例位置&#xff1a; 使用 loc‘upper left’ 指定图例的基本位置为左上角。 使用 bbox_to_anchor(0.1, 0.9) 来进行自定义位置调整&#xff0c;其中 (0.1, 0.9) 指定图例相对于图形区域的坐标 (x, y)。 0.1 表示距离左边界的比例位置&#xff0c;0.9 表示距离上边界的比例位置…

【01课_初识算法与数据结构】

一、理解算法 1、算法的概念 算法&#xff0c;个人理解就是计算一段逻辑&#xff0c;最简化&#xff0c;最快速的方式、方法 每个函数&#xff0c;就包含了一定的算法&#xff0c;执行一定的计算逻辑 算法是一系列程序指令&#xff0c;用于解决特定的运算和逻辑问题 2、衡…

《⼆叉搜索树》

《⼆叉搜索树》 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3 二叉树的功能说明及实现3.1 ⼆叉搜索树的插⼊3.2 ⼆叉搜索树的查找3.3 ⼆叉搜索树的删除 4二叉搜索树的实现代码5 ⼆叉搜索树key和key/value使⽤场景5.1 key搜索场景&#xff1a;5.2 key/value搜索场景&#xff1a…

stm32 踩坑笔记

串口问题&#xff1a; 问题&#xff1a;会改变接收缓冲的下一个字节 串口的初始化如下&#xff0c;位长度选择了9位。因为要奇偶校验&#xff0c;要选择9位。但是接收有用数据只用到1个字节。 问题原因&#xff1a; 所以串口接收时会把下一个数据更改

卫星授时服务器,单北斗授时服务器,北斗卫星时钟服务器

当前NTP授时服务器已经实现内部的元器件及芯片实现采用国产化&#xff0c;已经证明了国产产品已经摆脱需要依靠进口元器件及芯片才能实现的产品研发、也证明了大国崛起。下来我们来分析下国产化服务器具备的优势。 1、采用国产操作系统&#xff1a;使用国产化系统Linux更加可靠…

Windows11免密码自动登录

按winR&#xff0c;打开运行&#xff0c;输入Control Userpasswords2&#xff0c;打开用户账户。 打开该设置&#xff0c;取消选中该选项&#xff0c;点击应用&#xff0c;输入想要自动登录的账户和密码&#xff0c;即可开机后自动登录Windows。 若此界面无该选项&#xff0c;…

C++使用开源ConcurrentQueue库处理自定义业务数据类

ConcurrentQueue开源库介绍 ConcurrentQueue是一个高性能的、线程安全的并发队列库。它旨在提供高效、无锁的数据结构&#xff0c;适用于多线程环境中的数据交换。concurrentqueue 支持多个生产者和多个消费者&#xff0c;并且提供了多种配置选项来优化性能和内存使用。 Conc…

中仕公考:2025年省考可以开始准备了!

“各省公务员考试”&#xff0c;是选拔和招录公务员的一种重要方式。该考试由各省级主管部门统一安排&#xff0c;编制归属于各个省份。 考试时间 各省的考试时间有所不同&#xff0c;但通常省联考的时间一般安排在3-5月之间。 户籍限制 部分岗位对考生的户籍有限制&#x…

保姆级教程,免费短链平台

神行短链 开源代码: https://github.com/EASTCATV/openShortLink.git 保姆级教程,5分钟打造属于自己的短链 免费短链平台 免费使用 短链生成 免费使用 地址: short.godsdo.com short.godsdo.com 打包命令 sbt clean && sbt packagedocker run -d \ --name shot…

三十六、Python基础语法(JSON操作)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种基于文本&#xff0c;轻量级的数据交换格式。它易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;在自动化测试中经常用来存放测试数据。 JSON的特点&#xff1a; 基于文本&#xff0c;不包含图…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

【SAP】关于权限的继承

关于权限的父role和子role的权限继承&#xff0c;既可以 从子role主动去父role那里“取”。从父role“推”到子role 我自己之前一直用的是方法1&#xff0c;但由于子role很多&#xff0c;一个一个手工维护花了不少时间。 后来得知有方法2&#xff0c;特此测试。 我准备了父R…

信息安全数学基础(46)域和Galois理论

域详述 定义&#xff1a; 域是一个包含加法、减法、乘法和除法&#xff08;除数不为零&#xff09;的代数结构&#xff0c;其中加法和乘法满足交换律、结合律&#xff0c;并且乘法对加法满足分配律。同时&#xff0c;域中的元素&#xff08;通常称为数&#xff09;在加法和乘法…

时序约束进阶五:Set_Max_Delay与Set_Min_Delay详解

目录 一、背景 二、Max/Min_delay约束 2.1 约束设置参数 2.2 约束说明 三、场景说明 3.1 路径分段 3.1.1 无效的约束对象 3.1.2 设计代码 3.2 有效的约束对象 3.3 datapath only 3.3.1 工程设计 3.3.2 datapath only报告 3.4 clock group约束优先级 3.4.1 MAX/MIN…

搭建实验仪器知识库:从产品手册到智慧资源的飞跃

在科研、教学及工业生产领域&#xff0c;实验仪器作为探索未知、验证理论、提升效率的重要工具&#xff0c;其重要性不言而喻。然而&#xff0c;随着技术的不断进步和仪器的日益复杂化&#xff0c;如何高效、准确地使用这些仪器成为了科研人员、技术人员及学生面临的共同挑战。…

OA项目 python + vue3

准备工作 创建django项目 在setting.py进行数据库的配置&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: , #数据库名字USER: , #连接的数据库的用户名PASSWORD: ,HOST: 127.0.0.1,PORT: 3306,} }安装app&#xff1a; rest_framwork: 关闭csrf…

婚礼纪 9.5.57 | 解锁plus权益的全能结婚助手,一键生成结婚请柬

婚礼纪是一款结婚服务全能助手&#xff0c;深受9000万新人信赖的一站式结婚服务平台。解锁plus权益后&#xff0c;用户可以享受部分VIP会员功能。应用提供了丰富的结婚筹备工具和服务&#xff0c;包括一键生成结婚请柬、婚礼策划、婚纱摄影、婚宴预订等。婚礼纪旨在为新人提供全…

树形结构数据

树形结构数据 树形结构数据是一种基础且强大的数据结构&#xff0c;广泛应用于计算机科学和软件开发的各个领域。它模拟了自然界中树的层级关系&#xff0c;通过节点和它们之间的连接来组织数据。在本文中&#xff0c;我们将深入探讨树形结构数据的概念、特点、类型以及它们在…