博客系统后端设计(七) - 实现显示用户信息与注销功能
文章目录
- 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. 显示用户信息 此处的用户名是写死的,我们希望的是此处是能够动态生…...
Spring5 学习笔记
前置知识: 掌握Java基础知识(特别是反射)掌握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 分割链表 (中等)解题思路:链表专题 leetcode 86 分割链表 (中等) leetcode 86 分割链表 原题链接,可以直接测试 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进…...
使用 AD8232 ECG 传感器和 ESP32 进行基于物联网的 ECG 监测
这篇文章是使用 AD8232 ECG 传感器和 ESP32 进行基于物联网的 ECG 监测。可以从世界任何地方在线观察来自患者心脏的心电图信号。 目录 概述 什么是心电图? 心电图的医疗用途 AD8232 心电图传感器...
【Linux初阶】基础IO - 文件操作(使用系统接口实现) | vim批量注释代码
🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:重新理解文件和文件操作,C语言实现的简单文件操作,文本初始权限,系统接口介…...
网络安全之信息收集
第一部分:被动信息收集 1、简介 在信息收集这块区域,我将其分为两部分:第一部分即被动信息收集,第二部分即主动信息收集。 对于标准的渗透测试人员来说,当明确目标做好规划之后首先应当进行的便是信息收…...
ModuleNotFoundError: No module named ‘_lzma‘
安装torchvision报错:ModuleNotFoundError: No module named ‘_lzma’ 参考文章:https://zhuanlan.zhihu.com/p/404162713 解决思路:用backports.lzma代替_lzma包 解决步骤:(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——创建一个测试容器
测试容器并不是什么都没有的容器,只是它没有我们期望的常驻进程。我们常用它来做一些测试。 举个例子,在《研发工程师玩转Kubernetes——自动扩缩容》中我们使用本地wrk进行了压力测试。如果我们希望进入容器手工调用wrk,该怎么做呢ÿ…...
FPGA - 7系列 FPGA内部结构之CLB -03- CLB相关原语以及应用
前言 本文节选UG474的第二章,进行整理翻译。CLB资源被FPGA综合工具自动有效地使用,不需要任何特殊的FPGA专用编码。一些HDL编码建议和技术可以帮助优化设计以获得最大效率。 设计检查清单 这些指南是为有效使用7系列CLB的设计建议提供的快速核对表。7…...
什么是日志关联
什么是日志关联 日志关联是一种分析来自不同源的日志数据以识别事件模式的技术。它用于更好地了解网络的活动,从而有效地保护网络免受漏洞和威胁。 日志关联是日志管理过程的关键部分。收集和存储日志后,集中式日志服务器将执行分析以检测特定事件。日…...
打家劫舍问题 Python题解
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
【JavaSE】Java基础语法(十八):接口
文章目录 1. 接口的概述2. 接口的特点3. 接口的成员特点4. 类和接口的关系5. 抽象类和接口的关系 1. 接口的概述 接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。Java中接口存在的两个意义 用来定义规范用来做功能的拓展 2. 接口的特点…...
SVD求解两组多维点之间的欧式变换矩阵,及halcon代码实现
之前研究了二维点的仿射变换,用解矩阵的方式求解了两组二维点之间的变换矩阵。 学习了下SVD,看到可以用SVD求解两组多维点之间的欧式变换矩阵,当然也是个最优化问题。 这里的变换只有平移和旋转,没有缩放。 一、先说结论&#…...
常用监控方案 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在屏幕内来回运动,碰到边缘会反弹…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
