6.登录功能的开发——获取当前用户、用户退出

登录功能的开发——获取当前用户、用户退出

  • 一、获取当前用户
    • 1.1后端处理
    • 1.2前端处理
  • 二、用户的退出
    • 2.1后端
    • 2.2前端

一、获取当前用户

在上一篇文章,我们实现了用户的的登录,但是后续并没有处理完整,比如登录成功后你要跳转回原来的的页面吧,你要将登录的账号显示在页面吧。这些将在这一篇文章进行处理。

1.1后端处理

在UserServlet类中添加新的路径,用来判断调用新的方法。

@WebServlet({"/user/login","/user/curr"
})

在doGet方法的switch分支处理结构加上新的case:

            case "/user/curr":userCurr(req,resp);break;

实现userCurr方法:
还记得我们登录时数据放在哪里了吗,在登录成功时我们通过
req.getSession().setAttribute("CurrUser", user);
把登录用户的信息放在了Session中了,现在我们要获取当前登录的用户信息就要从Session中拿出来。

private void userCurr(HttpServletRequest req, HttpServletResponse resp) throws IOException {Object user =req.getSession().getAttribute("CurrUser");//从Session中取出数据if(user!=null){MyWeb.printJson(resp,R.OK(user));}else{MyWeb.printJson(resp,R.err("未登录!"));}}

我们从请求的会话(Session)中获取名为 “CurrUser” 的属性,放入user对象中,如果不为空,说明用户数据存在我们发送往前端一个包含数据的成功响应,如果为空那么说明没登录,那么向前端发送一个包含错误信息的响应。
后端到这里就完成了,接下来我们要在前端处理响应。

1.2前端处理

话不多说,直接上代码:

    const getCurrUser =async ()=>{document.querySelector("#loginBtn").style.display="block";//显示document.querySelector("#currBtn").style.display="none";//不显示const resp =await fetch("/user/curr");//获取响应if(!resp.ok) return;const result =await resp.json();if(!result.success) return;const user =result.data;console.log(user);document.querySelector("#userName").innerText =`${user.u_nickname}${user.u_id}`;//user.u_nickname;``document.querySelector("#loginBtn").style.display="none";document.querySelector("#currBtn").style.display="block";}getCurrUser();

在首页也就是index.html中,我们创建一个getCurrUser函数,用来处理后端发过的响应,获取用户的数据。
首先是先将元素初始化,确保没有问题,不写这两行,页面设计之初也是这样的,没有什么较大的影响,方便自己代码阅读。此时登录元素显示,用户元素不显示的。
如果两个都显示就是这样的:
在这里插入图片描述
登陆后我们要将当前用户显示出来。
接下来我们向后端发起请求获取响应,根据响应状态判断,成功状态我们就获取响应中的json格式的数据放入result对象中,如果result.success为真,我们就拿出数据,在控制台打印(便于调试),然后在当前文档中查找id为userName的元素,将获取的数据赋值给它的子元素innerText来显示,最后隐藏登录元素,显示当前用户元素,就完成了。

在这里插入图片描述
运行项目出现这样,那么就成功了!

二、用户的退出

2.1后端

对于用户的退出,要知道我们的数据放在Session中的,将数据包含在响应中发送往前端的,前端通过 响应状态处理数据。所以要实现用户的退出,我们首先接收前端发送过来的请求响应,解析路径地址,调用用户的退出方法就可以了。

  1. 在注解中加入新的路径: "/user/exit"
  2. 在switch分支结构中加入新的case板块:
            case "/user/exit":userExit(req,resp);break;
  1. 实现userExit方法:
    private void userExit(HttpServletRequest req, HttpServletResponse resp) throws IOException {req.getSession().removeAttribute("CurrUser");MyWeb.printJson(resp,R.OK());}

非常简洁,直接把存放在Session中的用户数据使用remove方法去除,然后包含成功的响应返回给前端,让前端进行页面上的处理。
后端到这里完成

2.2前端

首先我们退出也是有一个页面的,我们要在用户点击退出时跳转到退出页面。
所以我们在退出元素href属性加上路径,让点击后浏览器导航到退出的页面。

            <li><a class="dropdown-item" href="#">退出</a></li>

增加路径,指向退出页面:

           <li><a class="dropdown-item" href="exit.html">退出</a></li>

到这里,用户点击退出后浏览器跳转到推出页面,一直在这里。

现在我们需要进行那些操作?

  1. 提示退出成功与否的信息
  2. 退出成功与否都要返回首页

所以现在在退出页面引入轻组件用来显示提示消息:

<div class="toast-container position-fixed top-0 start-50 translate-middle-x mt
1"><div id="toast" class="toast opacity-100 bg-white"><div class="toast-header"><strong class="me-auto"></strong><button type="button" class="btn-close" data-bs-dismiss="toast"></button></div><div class="toast-body"></div></div>
</div>

和之前引入的是一样的。
引入之后,我们要把组件转换为对象,以及创建函数来为后续不同消息提示铺垫条件:

    const toastObj = new bootstrap.Toast(document.querySelector("#toast"),{delay:2200});const toast = (title = "信息", msg = "") => {document.querySelector("#toast .me-auto").innerHTML = title;document.querySelector("#toast .toast-body").innerHTML = msg;//注意空格加点toastObj.show();}

函数根据传入的参数设置组件子元素的信息,以便显示不同消息。注意 document.querySelector方法参数的写法,组件id后面有空格在加点加子元素,注意规范不然找不到的。(我当时没注意,组件不出来,找了半天)
接下来最后一步:编写qiut函数向后端发起请求并且通过响应判断退出状态。

    const quit = async () => {const resp = await fetch("./user/exit");if (!resp.ok) {toast("失败!", "退出失败!");setTimeout(() => location.href = 'index.html', 1500);return;}const result = await resp.json();if (!result.success) {toast("失败!", result.message);setTimeout(() => location.href = 'index.html', 1500);return;}setTimeout(() => {toast("成功", "退出成功!");document.querySelector("#exitLoading").style.display = "none";document.querySelector("#exitInfo").innerHTML = "正在跳转中...";setTimeout(() => location.href = "index.html", 1500);}, 1500);};quit();

函数不难,就是根据响应显示不同的信息,跳转回首页就好了

  1. 定义路径,和后端一样,让后端执行退出方法。
  2. 使用fetch函数向后端发起请求,返回的响应存在resp对象中
  3. 判断响应状态,如果响应是不成功的,那么调用组件函数显示退出失败的信息,并且使用延时执行的函数来返回首页。响应成功,那么获取响应中json格式的数据存放在result对象中,对对象进行判断,大概就是对象为空说明数据去除了,那么就退出成功,如果数据存在那么说明数据并没有去除掉,那么退出失败,延时执行函数跳转回首页。
  4. 最后如果上述条件判断都完成,退出成功时,组件显示成功退出的消息,然后 将原来网页的动画隐藏起来,将信息换成正在跳转...,然后延时执行函数返回首页。

这么做的原理是让为了用户体验,其次操作完成的反馈,和页面有动画或过渡效果,延迟可以确保这些效果有足够的时间执行完毕。
效果:https://live.csdn.net/v/418336

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

酷家乐 同盾滑块分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

Linux 软件编程 数据库与网页

sqlite3数据库操作效率&#xff1a; 1.增加事务机制 2.关闭数据库磁盘同步写入 3.使用预处理SQL语句机制实现提升数据库效率 事务机制&#xff1a; 1.可以提高sqlite处理数据的效率 2.确保数据的一致性 关闭数据库中写同步机制&#xff1a; 在…

【GH】【EXCEL】P3: Set Conditional Formatting To Excel Data By Gh

文章目录 conditional formattingdata sourceConditional ScaleConditional Scale Conditional PercentConditional Top Percent Conditional AverageConditional Average Multiple ConditionsConditional BarConditional Bar Conditional UniqueConditional Unique Conditiona…

推荐一个完全自由的目录设计网站

引言 如果我们能通过网站出一本书&#xff0c;这将是一件很酷的事。 事实上&#xff0c;我们通过网站发布知识&#xff0c;最常见的是写博客。 这二者有什么区别呢&#xff1f; 书本的知识内容有很强的逻辑性、系统性。而博客是随心所欲的&#xff0c;一时灵感来了就写一篇…

鸿蒙(API 12 Beta3版)【使用ImagePacker完成图片编码】图片开发指导

图片编码指将PixelMap编码成不同格式的存档图片&#xff08;当前仅支持打包为JPEG、WebP 和 png 格式&#xff09;&#xff0c;用于后续处理&#xff0c;如保存、传输等。 开发步骤 图片编码进文件流 创建图像编码ImagePacker对象。 // 导入相关模块包 import { image } fr…

《计算机操作系统》(第4版)第6章 输入输出系统 复习笔记

第6章 输入输出系统 一、I/O 系统的功能、模型和接口 1.I/O 系统的基本功能 (1)隐藏物理设备的细节。 (2)与设备的无关性。 (3)提高处理机和I/O 设备的利用率。 ( 4 ) 对I/O 设备进行控制。 (5)确保对设备的正确共享。 (6)错误处理。 2.I/O 系统的层次结构和模型 (…

Stability AI发布了单目视频转4D模型的新AI模型:Stable Video 4D

开放生成式人工智能初创公司Stability AI在3月发布了Stable Video 3D&#xff0c;是一款可以根据图像中的物体生成出可旋转的3D模型视频工具。Stability AI在7月24日发布了新一代的Stable Video 4D&#xff0c;增添了赋予3D模移动作的功能。 Stable Video 4D能在约40秒内生成8…

[数据集][目标检测]手钳检测数据集VOC+YOLO格式141张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;141 标注数量(xml文件个数)&#xff1a;141 标注数量(txt文件个数)&#xff1a;141 标注类别…

5G+工业互联网产教融合创新实训室解决方案

一、建设背景 随着第五代移动通信技术&#xff08;5G&#xff09;的快速普及和工业互联网的迅猛发展&#xff0c;全球制造业正面临着前所未有的深刻变革。5G技术凭借其超高的传输速率、极低的延迟以及大规模的连接能力&#xff0c;为工业自动化、智能制造等领域带来了革命性的…

访客管理系统 对接微信公众号,发送通知消息

微信公众号模板消息 - 要实现的效果图 1 公众号设置对接的域名 打开【公众号设置】 公众号设置域名&#xff0c;需要先用http server做安全验证。 安全验证成功后&#xff0c;域名配置完毕。 2 获取公众号APPID 和 Secret 3 开通模板消息 官方审核需要2-3日 4 设置IP白名单&…

芯片后端之 PT 使用 report_timing 产生报告 之 -nets 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -nets 选项 。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路径延时信息,仅仅显示…

docker yapi安装

概述 YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API&#xff0c;YApi 还为用户提供了优秀的交互体验&#xff0c;开发人员只需利用平台提供的接口数据写入工具以及简单…

学习记录——day35 数据库 sqlite3

目录 一、安装sqlite3数据库以及sqlite3函数库 二、数据库的结构 三、常用数据库类型 1、sqlite3 2、mysql 四、sqlite3数据库的使用 1、打开数据库 2、sqlite3数据库中指令的使用 1&#xff09;界面指令 2&#xff09;操作指令 3&#xff09;大小写敏感性 3、创建表…

外排序之文件归并排序实现

外排序介绍 外排序是指能够处理极大量数据的排序算法。通常来说&#xff0c;外排序处理的数据不能一次装入内存&#xff0c;只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是⼀种“排序-归并”的策略。在排序阶段&#xff0c;先读入能放在内存中的数据量&#x…

贪吃蛇(Qt版)

目录 一、项目介绍 界面一&#xff1a;游戏大厅界面 界面二&#xff1a;关卡选择界面 界面三&#xff1a;游戏界面 最终游戏效果&#xff1a; 二、项目创建与资源配置 1. 创建项目 2. 添加项目资源文件 三、项目实现 1. 游戏大厅界面 2. 关卡选择界面 3. 游戏房间界…

TCP 粘包问题

TCP是一个面向字节流的传输层协议。“流” 意味着 TCP 所传输的数据是没有边界的。这不同于 UDP 协议提供的是面向消息的传输服务&#xff0c;其传输的数据是有边界的。TCP 的发送方无法保证对方每次收到的都是一个完整的数据包。于是就有了粘包、拆包问题的出现。粘包、拆包问…

进程的创建、终止

目录 前言1. 进程创建2. 进程终止3. exit && _exit 的异同3.1 相同点3.2 不同点 前言 紧接着进程地址空间之后&#xff0c;我们这篇文章开始谈论进程控制相关的内容&#xff0c;其中包括进程是如何创建的&#xff0c;进程终止的几种情况&#xff0c;以及进程异常终止的…

Android低内存设备系统优化

切记,所有的优化都遵循一条准则: 空间换时间,时间换空间。 一、前言 我们为什么会觉得卡顿、不流畅? 卡顿等性能问题的最主要根源都是因为渲染性能,Android系统很有可能无法及时完成那些复杂的界面渲染操作。Android系统每隔16ms发出信号,触发对UI进行渲染,如果每次渲染…

Thinkphp6 反序列化漏洞分析

本文来自无问社区&#xff0c;更多实战内容可前往查看http://wwlib.cn/index.php/artread/artid/10431.html 版本&#xff1a;Thinkphp6&PHP7.3.4 TP 环境搭建利用 composer 命令进行&#xff0c;同时本次分析在 windows 环境下进行 composer create-project topthink/t…

Android 架构模式之 MVP

目录 架构设计的目的对 MVP 的理解代码ModelViewPresenter Android 中 MVP 的问题试吃个小李子ModelViewPresenter效果展示 大家好&#xff01; 作为 Android 程序猿&#xff0c;你有研究过 MVP 架构吗&#xff1f;在开始接触 Android 那一刻起&#xff0c;我们就开始接触 MVC…