【从0做项目】Java音缘心动(2)———登录、统一返回设计

 

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:登录模块设计

1:实体类

2:登录的请求和响应设计

二:设计统一的响应体类

1:参考

(1)@ControllerAdvice

(2)ResponseBodyAdvice接口

2:自己设计统一结果响应类

 三:用户登录管理类

1:@RestController

2:代码理解

四:UserMapper层

1:设计接口

2:配置UserMapper.xml


一:登录模块设计

1:实体类

@Data
public class Music {private int id;private String title;private String singer;private String url;private String time;private int userid;
}
@Data
public class User {private Integer id;private String userName;private String password;
}

2:登录的请求和响应设计

二:设计统一的响应体类

1:参考

因为在博客系统项目中,已经使用过统一结果返回了,如下

注解介绍

(1)@ControllerAdvice

全局响应处理,它可以拦截所有被@Controller和@RestController注解修饰的类里的方法(后面为方便描述统一叫Controller方法了哈)。他就是一个增强类

就好比,无论你是谁,你进火车站都得过安检,

(2)ResponseBodyAdvice接口

用于在Controller方法返回我们包装的响应体之前,对响应(body)做处理。

注意:这个接口中同一结果返回已经包含了序列化,所以我们要对String类型单独做处理,避免统一结果返回的时候双重序列化!!解决办法就是提前先给序列化

看这个例子——Jackson库中ObjectMapper类序列化操作

第一步:把String类包装为Result对象

第二步:再把这个对象序列化为字符串

if(body instanceof String){return objectMapper.writeValueAsString(Result.success(body));}

拉回来:ResponseBodyAdvice需要实现两个方法

supports() 

类似启动开关,true为开,判断是否需要对当前返回值进行处理

②beforeBodyWrite()

在返回响应体之前对数据进行处理。这里主要是类型的判定

这里,我想尝试自己去模拟ResponseAdvice设计一个类,用作统一结果返回

2:自己设计统一结果响应类

女少!~

@Data
public class ResponseBodyMessage <T>{private int status;//返回状态码private String message;private T data;//返回数据public ResponseBodyMessage(int status, String message, T data) {this.status = status;this.message = message;this.data = data;}
}

 三:用户登录管理类

1:@RestController

两个注解组成@Controller+@ResponseBody

被@RestController修饰的类,会被我们的启动类扫描到,主要处理HTTP请求

只有@Controller修饰,返回的是视图

加上@ResponseBody,就是告诉Spring我要直接将对象写入请求体当中,不要视图解析器解析我

简记:一个返回视图,一个返回具体数值

其它几个依赖注入,路由映射,参数绑定就不多bb了~~ 

2:代码理解

这里我们拿到前端输入的用户名和密码后,跟数据库中的数据进行比对校验

这里重点讲一下Cookie和Session会话,密码校验成功,服务器在响应体的Set-Cookie字段中添加一个令牌,这个令牌是服务器随机给的,比如说现在是:会话一,里面是一个key-value结构

Constants.USERINFO_SESSION_KEY就对应key,用户信息就对应value

public class Constants {public static final String USERINFO_SESSION_KEY = "USERINFO_SESSION_KEY";
}

这里的加密解析算法,先埋个伏笔,下一篇文章将详细解释 

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate BCryptPasswordEncoder bCryptPasswordEncoder;@RequestMapping("/login")public ResponseBodyMessage<User> login(@RequestParam String userName, @RequestParam String password , HttpServletRequest request){User loginUser = new User();loginUser.setUserName(userName);loginUser.setPassword(password);User userInfo = userService.selectByName(loginUser);if(userInfo == null){return new ResponseBodyMessage<>(-1,"用户名或者密码错误", userInfo);}else{if(!bCryptPasswordEncoder.matches(password,userInfo.getPassword())){return new ResponseBodyMessage<>(-1,"用户名或者密码错误",userInfo);}request.getSession().setAttribute(Constants.USERINFO_SESSION_KEY, userInfo);return new ResponseBodyMessage<>(0,"登录成功", userInfo);}}}

四:UserMapper层

1:设计接口

@Mapper
public interface UserMapper {User login(User loginUser);//username⽤⼾名是唯⼀的User selectByName(String username);}

2:配置UserMapper.xml

在resource⽬录下,新建mybatis⽂件夹,新建UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.musicserver.mapper.UserMapper"><select id="login" resultType="com.example.musicserver.model.User">select id , username , password from user where username = #{userName} and password = #{password}</select><select id="selectByName" resultType="com.example.musicserver.model.User">select id , username , password from user where username = #{userName}</select>
</mapper>​

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

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

相关文章

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

【个人开源】——从零开始在高通手机上部署sd(二)

代码&#xff1a;https://github.com/chenjun2hao/qualcomm.ai 推理耗时统计 单位/ms 硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae骁龙8 gen124716.994133440.39723.215411.097696.327 1. 下载依赖 下载opencv_x64.tar,提取码: rrbp下载opencv_aarch64.t…

从混沌到有序:一个数据血缘分析的进化故事

从混沌到有序&#xff1a;一个数据血缘分析的进化故事 从混沌到有序的数据治理之路数据血缘的建设方法和实践路径数据血缘的实践场景和未来趋势。 数据就像流淌在企业血管中的血液&#xff0c;它的每一次流动、每一次转化都留下独特的印记。 作为数据工程师&#xff0c;我曾困惑…

JavaSE学习笔记25-反射(reflection)

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09; 是一种强大的机制&#xff0c;允许程序在运行时检查和操作类、方法、字段等信息。通过反射&#xff0c;可以动态地创建对象、调用方法、访问字段&#xff0c;甚至修改私有成员。反射的核心类是 java.lang.re…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中&#xff0c;我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题&#xff1a; Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

【测试】⽤例篇

本节重点⽬标 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 基于需求的设计⽅法 具体的设计⽅法 等价类 边界值 判定表法 正交法 场景法 错误猜测法 1. 测试⽤例 1.1 概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为…

C++17中std::chrono::duration和std::chrono::time_point的舍入函数

文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中&#xff0c; std::chrono库提供了一组强大的时间处理工具&#xff0c;包…

Go 语言结合 Redis 实现固定窗口、滑动窗口、令牌桶和漏桶限流算法的示例代码

固定窗口算法 原理&#xff1a;将时间划分为固定大小的窗口&#xff0c;在每个窗口内对请求进行计数。如果请求数超过设定的阈值&#xff0c;则拒绝后续请求&#xff0c;直到进入下一个窗口。代码&#xff1a; package mainimport ("fmt""time""git…

linux之perf(17)PMU事件采集脚本

Linux之perf(17)PMU事件采集脚本 Author: Once Day Date: 2025年2月22日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Perf性能分析_Once_day的博…

兰州百合基因组(36.68 Gb)-文献精读113

The evolutionary tale of lilies: Giant genomes derived from transposon insertions and polyploidization 百合的进化故事&#xff1a;由转座子插入和多倍化导致的巨型基因组 百合&#xff08;Lilium spp.&#xff09;&#xff0c;被誉为“球根花卉之王”&#xff0c;因其…

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end

UE5.3 C++ TArray系列(一)

一.TArray概述 它们就相当于C动态数组Vector&#xff0c;但是被UE封装了&#xff0c;懂得都懂反射嘛&#xff0c;要不一不小心就被回收了。 它真的非常常见&#xff0c;我所用的容器中&#xff0c;它绝对排名第一&#xff0c;第二是TMap。 同类好理解&#xff0c;我平时也常用…

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…

MySQL数据库——表的约束

1.空属性&#xff08;null/not null&#xff09; 两个值&#xff1a;null&#xff08;默认的&#xff09;和not null&#xff08;不为空&#xff09; 数据库默认字段基本都是字段为空&#xff0c;但是实际开发时&#xff0c;尽可能保证字段不为空&#xff0c;因为数据为空没办法…

腿足机器人之十一- 深度强化学习

腿足机器人之十一- 深度强化学习 机器人能力腿足机器人RL问题建模强化学习解决方案 强化学习算法库选择建议 深度学习技术已经在语音、图像、视频、文本等领域应用广泛&#xff0c;其和强化学习的结合使得基于深度学习的大模型能力更是上升一个台阶。因而用在腿足机器人的运动中…

如何教计算机识别视频中的人类动作

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 =============…

Redisson分布式锁java语法, 可重入性实现原理 ,(还有可重试性,超时不释放,主从一致性)

Redisson在java的使用方法 Redisson分布式锁不可重入的实现原理 设置一个HSET key为锁的名字&#xff0c;field为当前获取锁的线程名字&#xff0c;value为可重入锁的当前已经重入次数 追踪源码发现RedissonClient类的tryLock就是用lua脚本和上图逻辑实现的加锁解锁&#xf…

YOLOv8与DAttention机制的融合:复杂场景下目标检测性能的增强

文章目录 1. YOLOv8简介2. DAttention (DAT)注意力机制概述2.1 DAttention机制的工作原理 3. YOLOv8与DAttention (DAT)的结合3.1 引入DAT的动机3.2 集成方法3.3 代码实现 4. 实验与结果分析4.1 实验设置4.2 结果分析推理速度性能对比 5. 深度分析&#xff1a;DAttention在YOLO…

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;本地运行框架&#xff0c;旨在简化大模型的部署和管理流程&#xff0c;使开发者、研究人员及爱好者能够高效地在本地环境中实验和…

springboot+dubbo+zookeeper的注册服务和调用实践

目录 zookeeper为什么可作为注册中心zookeeper注册中心优缺点启动zookeeper编写springboot项目提供dubbo服务1. 服务接口2. Springboot引入dubbo实现服务接口2.1 工程目录和依赖2.2 启动程序和application.properties2.3 DubboService 实现服务接口2.4 测试api&#xff0c;用于…