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

博客系统后端设计(七) - 实现显示用户信息与注销功能

文章目录

  • 1. 显示用户信息
    • 1.1 约定前后端交互接口
    • 1.2 修改列表页的前段代码
    • 1.3 实现详情页的后端代码
    • 1.4 实现详情页的前端代码
  • 2. 注销
    • 2.1 确定前后端交互接口
    • 2.2 实现后端代码
    • 2.3 修改前端代码

1. 显示用户信息


此处的用户名是写死的,我们希望的是此处是能够动态生成的。



如果是此时登录的列表页,此处显示的是登录用户的信息。
如果此时登录的是详情页,此处显示的是该文章的作者信息。

1.1 约定前后端交互接口


由于列表页和详情页显示的信息是不一样的,在约定前后端交互接口的时候要分为两种不同的情况。

这里先来约定列表页:

请求使用 GET 路径是 /login

响应是 HTTP/1.1 200 OK
它的格式如下:

{userId: 1,username: 'zhangsan'.password: '123'
}



接下里约定详情页:

请求使用 GET 路径是 /author?blogId=1

响应是 HTTP/1.1 200 OK
它的格式如下:

{userId: 1,username: 'zhangsan'.password: '123'
}


列表页的后端已经实现了,稍微修改前端代码即可,把得到的用户信息显示出来。

详情页是重新实现的。

1.2 修改列表页的前段代码


let h3 = document.querySelector(‘.container-left .card h3’);
h3.innerHTML = body.username;

以上的两条语句把当前的用户信息显示到界面上。

function checkLogin() {$.ajax({type: 'get',url: 'login',success: function(body) {if (body.userId && body.userId > 0) {// 登录成功!console.log("当前用户已经登录!!!");// 加上这个功能,把当前的用户信息显示在界面上let h3 = document.querySelector('.container-left .card h3');h3.innerHTML = body.username;} else {// 当前未登录,跳转到登录页面location.assign('blog.in.html');}}});
}checkLogin();

1.3 实现详情页的后端代码


新建一个 AuthorServlet 类。

public class AuthorServlet extends HttpServlet {private ObjectMapper objectMapper = new ObjectMapper();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String blogId = req.getParameter("blogId");if (blogId == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("参数非法,缺少 blogId");return;}// 根据 blogId 查询,Blog 对象BlogDao blogDao = new BlogDao();Blog blog = blogDao.selectById(Integer.parseInt(blogId));if (blog == null) {// 博客不存在resp.setContentType("text/html; charset=utf8");resp.getWriter().write("没有找到指定博客 blogId = " + blogId);return;}// 根据 blog 中的 userId 找到对应的用户信息UserDao userDao = new UserDao();User author = userDao.selectById(blog.getUserId());String repJson = objectMapper.writeValueAsString(author);resp.setContentType("application/json; charset=utf8");resp.getWriter().write(repJson);}
}

1.4 实现详情页的前端代码


在详情页中创建一个新的方法。

 // 显示用户信息function getAuthor() {$.ajax({type: 'get',url: 'author',success: function(body) {// 把 username 设置到界面上let h3 = document.querySelector('.container-left .card h3');h3.innerHTML = body.username;}});
}getAuthor();

2. 注销


要想实现注销功能。需要判定当前的 登录状态;这里一共有两种方式:

1、看看是否能查到 http session 对象

2、看看 session 对象里有没有 user。

鉴于以上两种方式都可以实现注销功能,因此要么把 HttpSession 删掉;要么把 User 删掉,
满足以上一种情况即可。

getSession 有创建/获取会话的方法,但是没有删除会话的方法,因此想要删除会话会比较麻烦。
更好的办法就是 删除 user 对象,直接使用 removeAttribute 即可删除。

之前实现的逻辑中,httpsession 和 user 一定是一损俱损,一荣俱荣的。
但是在引入了注销逻辑之后,就会出现有 httpsession 无 user 的情况。

2.1 确定前后端交互接口


通过点击页面中的注销按钮,来实现注销功能,也就是通过点击注销按钮来触发请求。

请求使用 GET,路径是 /logout

响应使用 HTTP/1.1 302

2.2 实现后端代码


新建一个 LogoutServlet 类。

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession httpSession = req.getSession(false);if (httpSession == null) {// 未登录状态,直接提示错误resp.setContentType("text/html; charset=utf8");resp.getWriter().write("当前未登录!!!");return;}httpSession.removeAttribute("user");// 跳转到登录页面resp.sendRedirect("blog.in.html");}
}

2.3 修改前端代码


在之前写好的前端代码中的 a 标签里加上一个 logout 路径。

<a href="blog.list.html">主页</a>
<a href="blog.edit.html">写博客</a>
<a href="logout">注销</a>


主页 和 写博客跳转的就是对应的页面,以上代码要在列表页、详情页、编辑页都实现一遍。
只是登录页无注销功能,不需要给注销按钮加上一个 logout 路径,其他一样。

此时点击按钮就可以实现对应的功能了。

相关文章:

博客系统后端设计(七) - 实现显示用户信息与注销功能

文章目录 1. 显示用户信息1.1 约定前后端交互接口1.2 修改列表页的前段代码1.3 实现详情页的后端代码1.4 实现详情页的前端代码 2. 注销2.1 确定前后端交互接口2.2 实现后端代码2.3 修改前端代码 1. 显示用户信息 此处的用户名是写死的&#xff0c;我们希望的是此处是能够动态生…...

Spring5 学习笔记

前置知识&#xff1a; 掌握Java基础知识&#xff08;特别是反射&#xff09;掌握Java注解掌握XML掌握Maven Spring5学习笔记 1、Spring概述1.1、简介1.2、优点1.3、组成1.4、拓展 2、IOC理论推导2.1、分析实现2.2、IOC本质 3、HelloSpring3.1、导入jar包3.2、编写代码3.3、思考…...

leetcode--分隔链表(java)

分割链表 leetcode 86 分割链表 &#xff08;中等&#xff09;解题思路&#xff1a;链表专题 leetcode 86 分割链表 &#xff08;中等&#xff09; leetcode 86 分割链表 原题链接&#xff0c;可以直接测试 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进…...

使用 AD8232 ECG 传感器和 ESP32 进行基于物联网的 ECG 监测

这篇文章是使用 AD8232 ECG 传感器和 ESP32 进行基于物联网的 ECG 监测。可以从世界任何地方在线观察来自患者心脏的心电图信号。 目录 概述 什么是心电图? 心电图的医疗用途 AD8232 心电图传感器...

【Linux初阶】基础IO - 文件操作(使用系统接口实现) | vim批量注释代码

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;重新理解文件和文件操作&#xff0c;C语言实现的简单文件操作&#xff0c;文本初始权限&#xff0c;系统接口介…...

网络安全之信息收集

​​​第一部分&#xff1a;被动信息收集 1、简介 ​ 在信息收集这块区域&#xff0c;我将其分为两部分&#xff1a;第一部分即被动信息收集&#xff0c;第二部分即主动信息收集。 ​ 对于标准的渗透测试人员来说&#xff0c;当明确目标做好规划之后首先应当进行的便是信息收…...

ModuleNotFoundError: No module named ‘_lzma‘

安装torchvision报错&#xff1a;ModuleNotFoundError: No module named ‘_lzma’ 参考文章&#xff1a;https://zhuanlan.zhihu.com/p/404162713 解决思路&#xff1a;用backports.lzma代替_lzma包 解决步骤&#xff1a;(ubuntu系统) 安装依赖sudo apt-get install liblzma-d…...

标点符号相关的英语单词

Comma - 逗号 Period - 句号 Question mark - 问号 Exclamation mark - 感叹号 Semicolon - 分号 Colon - 冒号 Quotation marks - 引号 Parentheses - 括号 Brackets - 方括号 Hyphen - 连字符 Dash - 破折号 Ellipsis - 省略号 Apostrophe - 省略符号 Slash - 斜杠 Backslash…...

MyBatis的部分知识点

一、resultMap的constructor配置方式 <resultMap id"" type""> <constructor> <!--主键--> <idArg column"id" javaType"_int"/> <!--其他列--> …...

PAT A1089 Insert or Merge

1089 Insert or Merge 分数 25 作者 CHEN, Yue 单位 浙江大学 According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input…...

研发工程师玩转Kubernetes——创建一个测试容器

测试容器并不是什么都没有的容器&#xff0c;只是它没有我们期望的常驻进程。我们常用它来做一些测试。 举个例子&#xff0c;在《研发工程师玩转Kubernetes——自动扩缩容》中我们使用本地wrk进行了压力测试。如果我们希望进入容器手工调用wrk&#xff0c;该怎么做呢&#xff…...

FPGA - 7系列 FPGA内部结构之CLB -03- CLB相关原语以及应用

前言 本文节选UG474的第二章&#xff0c;进行整理翻译。CLB资源被FPGA综合工具自动有效地使用&#xff0c;不需要任何特殊的FPGA专用编码。一些HDL编码建议和技术可以帮助优化设计以获得最大效率。 设计检查清单 这些指南是为有效使用7系列CLB的设计建议提供的快速核对表。7…...

什么是日志关联

什么是日志关联 日志关联是一种分析来自不同源的日志数据以识别事件模式的技术。它用于更好地了解网络的活动&#xff0c;从而有效地保护网络免受漏洞和威胁。 日志关联是日志管理过程的关键部分。收集和存储日志后&#xff0c;集中式日志服务器将执行分析以检测特定事件。日…...

打家劫舍问题 Python题解

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

【JavaSE】Java基础语法(十八):接口

文章目录 1. 接口的概述2. 接口的特点3. 接口的成员特点4. 类和接口的关系5. 抽象类和接口的关系 1. 接口的概述 接口就是一种公共的规范标准&#xff0c;只要符合规范标准&#xff0c;大家都可以通用。Java中接口存在的两个意义 用来定义规范用来做功能的拓展 2. 接口的特点…...

SVD求解两组多维点之间的欧式变换矩阵,及halcon代码实现

之前研究了二维点的仿射变换&#xff0c;用解矩阵的方式求解了两组二维点之间的变换矩阵。 学习了下SVD&#xff0c;看到可以用SVD求解两组多维点之间的欧式变换矩阵&#xff0c;当然也是个最优化问题。 这里的变换只有平移和旋转&#xff0c;没有缩放。 一、先说结论&#…...

常用监控方案 Prometheus + Grafana 简单使用小结

文章目录 前言一、概念1.1 发展1.2 时序数据1.3 Metric 二、Prometheus2.1 架构2.2 配置2.3 查询语言PromQL2.4 Exporter 三、Grafana3.1 数据源3.2 权限3.3 面板可视化3.4 仪表盘 四、实战4.1 监控 Windows/Linux4.2 监控 JVM4.3 监控 MySQL4.4 监控 Springboot API 参考 前言…...

基于长短期神经网络LSTM的飞行轨迹跟踪预测,基于长短期神经网络LSTM的三维路径预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的飞行轨迹跟踪 完整代码: https://download.csdn.net/download/abc991835105/87705046 效果图 结果分析 展望 参考论文 背影 路径追踪预测,对实现自动飞行驾驶拥有重要意义,长短期神经网络是一种改进…...

计算机组成原理-指令系统-指令格式及寻址方式

目录 一、指令的定义 1.1 扩展操作码指令格式 二、指令寻址方式 2.1 顺序寻址 2.2 跳跃寻址 三、 数据寻址 3.1 直接寻址 3.2 间接寻址 3.3 寄存器寻址 ​ 3.4 寄存器间接寻址 3.5 隐含寻址 3.6 立即寻址 3.7 偏移地址 3.7.1 基址寻址 3.7.2 变址寻址 3.7.3 相对寻址…...

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…...

3分钟快速上手:用ComfyUI-MimicMotionWrapper实现专业级AI动作迁移

3分钟快速上手&#xff1a;用ComfyUI-MimicMotionWrapper实现专业级AI动作迁移 【免费下载链接】ComfyUI-MimicMotionWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-MimicMotionWrapper 你是否曾梦想过让普通人也能跳出专业舞者的优美动作&#xff1f;…...

手写前馈神经网络:从矩阵乘法到梯度下降的硬核实践

1. 这不是“AI科普”&#xff0c;而是一次亲手拆解前馈神经网络的硬核实践你有没有在某个深夜刷到“三分钟看懂神经网络”的短视频&#xff0c;点进去后发现全是齿轮转动、水流奔涌、大脑发光的动画&#xff0c;配上一句“信息像快递一样层层传递”&#xff1f;我试过——看完更…...

别再只盯着人脸了!手把手教你用Python复现2023年最新的多模态情绪识别模型COGMEN

别再只盯着人脸了&#xff01;手把手教你用Python复现2023年最新的多模态情绪识别模型COGMEN 情绪识别技术正在经历从单一模态到多模态融合的范式转变。传统基于面部表情的分析方法往往受限于光照条件、遮挡问题以及文化差异带来的表达偏差。2023年发布的COGMEN模型通过引入图…...

STM32 HAL库驱动NRF24L01避坑指南:SPI时钟配置、引脚命名那些容易出错的地方

STM32 HAL库驱动NRF24L01实战避坑手册&#xff1a;从SPI配置到中断处理的深度解析 当你在深夜的实验室里盯着示波器上杂乱的SPI波形&#xff0c;或是面对编译器抛出的"undefined reference"错误时&#xff0c;是否曾怀疑过NRF24L01这个看似简单的2.4GHz射频模块为何如…...

别再死记公式了!用Multisim仿真带你直观理解星三角变换(Y-Δ)

用Multisim仿真破解星三角变换&#xff1a;从公式恐惧到电路直觉 记得第一次在实验室里面对三相电路板时&#xff0c;那些密密麻麻的接线和闪烁的指示灯让我完全摸不着头脑。教授在黑板上写满Y-Δ变换公式时&#xff0c;我的笔记本上只留下了一堆问号——直到我发现仿真软件这…...

深度学习分段逼近实战:激活函数硬件友好型实现指南

1. 项目概述&#xff1a;为什么“分段逼近”不是数学游戏&#xff0c;而是深度学习落地的命脉“Mastering Deep Learning: The Art of Approximating Non-Linearities with Piecewise Estimations Part-2”——这个标题里藏着一个被太多教程刻意绕开的真相&#xff1a;深度学习…...

SSH Connection reset by peer与Permission denied深度排错指南

1. 这两个报错不是“网络不好”或“服务器卡了”&#xff0c;而是系统在向你发紧急求救信号“Connection reset by peer”和“Permission denied”——这两个SSH报错&#xff0c;几乎每个运维、开发、甚至刚接触Linux的学生都见过。但绝大多数人第一反应是&#xff1a;重启终端…...

Wireshark深度解析TLS 1.3与HTTP/2隐性故障pcap样本

1. 这不是一份普通pcap&#xff0c;而是一份“网络故障诊断教科书级样本”你有没有遇到过这样的情况&#xff1a;客户发来一个几十MB的pcap文件&#xff0c;标题叫“系统登录超时”&#xff0c;你打开Wireshark&#xff0c;密密麻麻全是TCP重传、RST包、DNS超时&#xff0c;但翻…...

5步终极指南:如何永久免费使用Cursor Pro AI编程助手

5步终极指南&#xff1a;如何永久免费使用Cursor Pro AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tria…...

ComfyUI-Impact-Pack:AI图像精细化增强的3大突破性技术革命

ComfyUI-Impact-Pack&#xff1a;AI图像精细化增强的3大突破性技术革命 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: htt…...