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

【JavaWeb学习Day20】

Tlias智能学习系统

员工登录

三层架构:

Controller:1.接收请求参数(用户名,密码)2.调用Service方法3.响应结果

具体实现:

/*** 登录*/
​
@PostMapping("/login")
public Result login(@RequestBody Emp emp){log.info("登录:{}",emp);LoginInfo info = empService.login(emp);if(info != null){return Result.success(info);}return Result.error("用户名或密码错误");
}

Service:1.根据用户名和密码查询员工信息2.判定,组装数据并放回

具体实现:

/*** 登录*/
@Override
public LoginInfo login(Emp emp) {//1.调用Mapper接口,根据用户名和密码查询员工信息Emp e = empMapper.selectByUsernamePassword(emp);//2.判断:判断是否存在这个员工,如果存在,组装登录信息if(e!=null){log.info("登录成功,员工信息:{}",e);return new LoginInfo(e.getId(),e.getUsername(),e.getName(),"");}//3.不存在,放回nullreturn null;
}

Mapper:SQL:select * from emp where username ='shinaian' and password ='123456';

具体实现:

/*** 登录*/
@Select("select id,username,name from emp where username = #{username} and password = #{password}")
Emp selectByUsernamePassword(Emp emp);

联调测试:

问题:在未登录的情况下,我们也可以直接访问部门管理、员工管理等功能

需求:只有在员工登录成功,才可以访问后台系统中的数据。

登录校验:

登录标记:用户登录成功之后,在后续的每一次请求中,都可以获取到该标记。【会话技术】

统一拦截:过滤器Filter、拦截器:Interceptor

会话技术:

会话:用户打卡浏览器,访问web浏览器资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享资源。

会话跟踪方案:

1.客户端会话跟踪技术:Cookie

2.服务端会话跟踪技术:Session

/**
​* HttpSession演示*/@Slf4j@RestControllerpublic class SessionController {
​//设置Cookie@GetMapping("/c1")public Result cookie1(HttpServletResponse response){response.addCookie(new Cookie("login_username","itheima")); //设置Cookie/响应Cookiereturn Result.success();}
​//获取Cookie@GetMapping("/c2")public Result cookie2(HttpServletRequest request){Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {if(cookie.getName().equals("login_username")){System.out.println("login_username: "+cookie.getValue()); //输出name为login_username的cookie}}return Result.success();}
​
​
@GetMapping("/s1")
public Result session1(HttpSession session){log.info("HttpSession-s1: {}", session.hashCode());
​session.setAttribute("loginUser", "tom"); //往session中存储数据return Result.success();
}
​
@GetMapping("/s2")
public Result session2(HttpSession session){log.info("HttpSession-s2: {}", session.hashCode());
​Object loginUser = session.getAttribute("loginUser"); //从session中获取数据log.info("loginUser: {}", loginUser);return Result.success(loginUser);
}
}   

3.令牌技术

JWT令牌—介绍:

全称:JSON Web Token(https://jwt.io/)

定义了一种简洁、自包含的格式,用于在通信双方以json数据格式安全的传输信息。

组成:

1.Header(头),记录令牌类型、签名算法等。例如:{"alg":"HS256","type":"JWT"}

2.Payload(有效载荷),携带一些自定义信息、默认信息等。例如:{"id":"1","username":"Tom"}

3.Signature(签名),放置Token被篡改、确保安全性。将header、payload融入,并加入指定秘钥,通过指定签名算法计算而来。

JWT令牌—生成/解析:

引入jjwt的依赖。

调用官方提供的工具类Jwts来生成或解析jwt令牌。

报错:JWT令牌被篡改或过期失效了

(注意事项:JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的)

   /*** 生成JWT令牌*/
@Testpublic void testGenerateJwt(){Map<String, Object> dataMap = new HashMap<>();dataMap.put("id",1);dataMap.put("username","admin");
​
​String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, "aXRoZWltYQ==").addClaims(dataMap).setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置过期时间.compact();System.out.println(jwt);}
​
/*** 解析令牌*/
​@Testpublic void testParseJWT(){String token = "eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImV4cCI6MTc0MDczMDEwNX0.BtOnJwrDgsAZTf3v-RJOhTwL7CESndEkl7gTU3XfgHU";Claims claims = Jwts.parser().setSigningKey("aXRoZWltYQ==")//指定密钥.parseClaimsJws(token)//解析令牌.getBody();//获取自定义信息System.out.println(claims);}

登录功能(令牌)

生成token(令牌)

1.定义JWT令牌操作工具类。(基于ai)

2.登录完成后,调用工具类生成JWT令牌,并放回。

public class JwtUtils {
​private static String signKey = "SVRIRUlNQQ==";private static Long expire = 43200000L;
​/*** 生成JWT令牌* @return*/public static String generateJwt(Map<String,Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}
​/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}

Service层代码修改:

/*** 登录*/
@Override
public LoginInfo login(Emp emp) {//1.调用Mapper接口,根据用户名和密码查询员工信息Emp e = empMapper.selectByUsernamePassword(emp);//2.判断:判断是否存在这个员工,如果存在,组装登录信息if(e!=null){log.info("登录成功,员工信息:{}",e);
​//生成Jwt令牌Map<String, Object> claims = new HashMap<>();claims.put("id",e.getId());claims.put("username",e.getUsername());String jwt = JwtUtils.generateJwt(claims);return new LoginInfo(e.getId(),e.getUsername(),e.getName(),jwt);}//3.不存在,放回nullreturn null;
}
过滤器(Filter):

概念:Filter过滤器,是javaWeb三大组件(Servlet、Filter、Listener)之一。

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

Filter快速入门:

1.定义Filter:定义一个类,实现Filter接口,并实现其所有方法。

2.配置Filter:Filter类上加@WebFilter注解,配置拦截路径。引导类上加@ServletComponentScan开启Servlet组件支持。

public class DemoFilter implements Filter {//初始化方法,web服务器启动的时候执行,只执行一次@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("拦截到了方法。。。。。");
​//放行filterChain.doFilter(servletRequest,servletResponse);
​}//拦截到请求之后,执行,会执行多次@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("init 初始化方法。。。。");}//销毁方法,web服务器关闭的时候执行,只执行一次@Overridepublic void destroy() {log.info("destroy 销毁方法。。。。");}

登录校验Filter:

@Slf4j
@WebFilter("/*")
public class TokenFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//1.获取请求路径String requestURI = request.getRequestURI();//2.判断是否是登录请求,如果路径中包含/login,说明是登录操作,放行if(requestURI.contains("/login")){log.info("登录请求,放行");filterChain.doFilter(request,response);}//3.获取请求头中的tokenString token = request.getHeader("token");//4.判断token是否存在,如果不存在,说明用户没有登录,放回错误信息(响应401状态码)if(token == null||token.isEmpty()){log.info("令牌为空,响应401");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return;}//5.如果token存在,校验令牌,如果校验失败,放回错误信息(401状态码)try {JwtUtils.parseJWT(token);} catch (Exception e) {log.info("令牌非法,响应401");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return;}//6.校验通过,放行log.info("令牌合法,放行");filterChain.doFilter(request,response);}
}

详解(执行流程、拦截路径、过滤器链):

执行流程:先执行放行前逻辑,对应资源访问完成后,执行放行后逻辑。

拦截路径:

(Filter可根据需求,配置不同的拦截资源路径)

过滤器链:

介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链。

顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。

拦截器Interceptor

快速入门:

概念:是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的,主要用来动态拦截控制器方法的执行。

作用:拦截请求,在指定的方法调用前后,根据业务需要执行预先定的代码。

//实现HandlerIntercepter
@Slf4j
@Component
public class DemoInterceptor implements HandlerInterceptor {//在目标资源方法运行之前运行- 返回值:true 放行,false 不放行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("preHandle....");return true;}
​//在目标资源方法运行之后运行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("postHandle");}
​//视图渲染完毕后运行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("afterCompletion");}
}//定义一个配置类实现WebMvcConfigurer接口,注册拦截器(/**)
/*** 配置类*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
​
​@Autowiredprivate DemoInterceptor demoInterceptor;
​@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(demoInterceptor).addPathPatterns("/**");//拦截所有请求}
}

令牌校验Interceptor:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1.获取请求路径String requestURI = request.getRequestURI();//2.判断是否是登录请求,如果路径中包含/login,说明是登录操作,放行if(requestURI.contains("/login")){log.info("登录请求,放行");return true;}//3.获取请求头中的tokenString token = request.getHeader("token");//4.判断token是否存在,如果不存在,说明用户没有登录,放回错误信息(响应401状态码)if(token == null||token.isEmpty()){log.info("令牌为空,响应401");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}//5.如果token存在,校验令牌,如果校验失败,放回错误信息(401状态码)try {JwtUtils.parseJWT(token);} catch (Exception e) {log.info("令牌非法,响应401");response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);return false;}//6.校验通过,放行log.info("令牌合法,放行");return true;
}

详解:

拦截路径:(可根据需要配置拦截路径)

执行流程(过滤器和拦截器同时存在):

Filter和Interceptor区别:

1.接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口

2.拦截范围不同:过滤器Filter会拦截所有资源,而Interceptor只会拦截Spring环境中的资源

相关文章:

【JavaWeb学习Day20】

Tlias智能学习系统 员工登录 三层架构&#xff1a; Controller&#xff1a;1.接收请求参数&#xff08;用户名&#xff0c;密码&#xff09;2.调用Service方法3.响应结果 具体实现&#xff1a; /*** 登录*/ ​ PostMapping("/login") public Result login(Reque…...

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(二级)真题 + 答案

青少年软件编程(Python)等级考试试卷(二级) ↓↓↓↓↓↓ 模拟 分数:100 题数:37 一、单选题(共25题,共50分) 1. 已知字典如下 dic1 = { name: Ming, age:20, grade: A, Tel:6666666 } 以下哪个代码运行结果为20?( ) A. dic1(age) B. dic1[1] C. dic1(20) D. dic1[ag…...

一、对iic类模块分析与使用

bmp280驱动代码 说明&#xff1a; 1、该模块用于获取气压&#xff0c;温度&#xff0c;海拔等数据。 vcc&#xff0c;gnd接电源 sda &#xff0c;scl 接iic通信引脚 2、该模块使用iic通信&#xff0c;通过iic发送请求相关类的寄存器值&#xff0c;芯片获取对应寄存器返回的数据…...

ROS 2机器人开发--CMakeLists.txt 文件详解

很多小白宝宝不懂CMakeLists.txt 究竟是干什么的&#xff0c;本文对CMakeLists.txt 文件进行详解 CMakeLists.txt 是 CMake 的核心文件&#xff0c;用户通过这个文件告诉 CMake 如何构建项目。这个文件通常包括设置项目名称、版本号、语言标准、编译器选项、查找依赖包、添加可…...

kan与小波,和不知所云的画图

文章目录 小波应用范围与pde小波的名字 画图图(a)&#xff1a;数值解向量 \( u \)图(b)&#xff1a;数值解向量 \( v \)结论图4 小波 在你提供的代码中&#xff0c;小波变换&#xff08;Wavelet Transform&#xff09;被用于 KANLinear 类中。具体来说&#xff0c;小波变换在 …...

使用DeepSeek实现自动化编程:类的自动生成

目录 简述 1. 通过注释生成C类 1.1 模糊生成 1.2 把控细节&#xff0c;让结果更精准 1.3 让DeepSeek自动生成代码 2. 验证DeepSeek自动生成的代码 2.1 安装SQLite命令行工具 2.2 验证DeepSeek代码 3. 测试代码下载 简述 在现代软件开发中&#xff0c;自动化编程工具如…...

算法题:快速排序

一、快速排序 1、快速排序总结 快速排序是一种高效的排序算法&#xff0c;基于分治法的思想。 分区操作是快速排序的核心&#xff0c;将数组分为两部分。 原地分区可以减少空间复杂度&#xff0c;提高效率。 快速排序的平均时间复杂度为 O(n log n)&#xff0c;但在最坏情况…...

Python的那些事第三十六篇:基于 Vega 和 Vega-Lite 的数据可视化解决方案,Altair 声明式可视化库

Altair 声明式可视化库:基于 Vega 和 Vega-Lite 的数据可视化解决方案 摘要 在数据科学和分析领域,有效的数据可视化是理解数据、发现模式和传达见解的关键。Python 作为数据科学的主要编程语言之一,提供了多种数据可视化库。其中,Altair 是一个基于 Vega 和 Vega-Lite 的…...

aws(学习笔记第三十课) 练习使用transit gateway

aws(学习笔记第三十课) 使用transit gateway 学习内容&#xff1a; 什么是transit gateway构造两个vpc&#xff0c;并且使用session manager访问private subnet的ec2练习使用transit gateway 1. 什么是transit gateway Transit Gateway的概念 Transit Gateway就是VPC和OnPro…...

Phpstudy中的MySQL无法正常启动或启动后自动暂停,以及sqlilab环境搭建出现的问题解决方法

【解决方法】 无法启动的原因是Phpstudy中的MySQL与本地的mysql重名&#xff0c;导致无法正常启动&#xff1b;所以这时我们就需要将本地的MySQL进行修改名称&#xff1b; 或者修改phpstudy中数据库的端口号&#xff0c;但是我觉得还是不是很好解决这种问题 最后一个方法&#…...

【Android】安卓付款密码输入框、支付密码输入框

如图 代码部分&#xff1a; public class PayPasswordDialog extends AppCompatDialogFragment {private String mPayPass "";private String mTitle, mMoney;private final TextView[] mPayPassTextViewArray new TextView[6];private List<Integer> mPayP…...

Python异常处理:从入门到精通的实用指南

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

【AVL树】—— 我与C++的不解之缘(二十三)

什么是AVL树&#xff1f; AVL树发明者是G. M. Adelson-Velsky和E. M. Landis两个前苏联科学家&#xff0c;他们在1962年论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树&#xff0c;说白了就是能够自己控制平衡结构…...

用大白话解释日志处理Log4j 是什么 有什么用 怎么用

Log4j是什么&#xff1f; Log4j就像程序的“黑匣子”&#xff0c;专门用来记录软件运行时的各种信息&#xff0c;比如哪里报错、性能如何、用户操作轨迹等。它是Java领域最常用的日志框架之一&#xff0c;可以灵活控制日志内容、输出位置&#xff08;控制台、文件、数据库等&a…...

无人机遥控器的亮度 和 两个工作频率

工作频率 2.4000-2.4835 GHz &#xff0c; 5.725-5.850 GHz 1.这是一个无人机的遥控器的两个工作频率&#xff0c;为什么会有两个工作频率&#xff1f; 无人机的遥控器采用双频段设计&#xff08;2.4GHz 和 5.8GHz&#xff09;&#xff0c;主要是为了解决以下问题并优化性…...

【Linux】命令行参数 | 环境变量(四)

目录 前言&#xff1a; 一、命令行参数&#xff1a; 1.main函数参数 2.为什么有它&#xff1f; 二、环境变量&#xff1a; 1.main函数第三个参数 2.查看shell本身环境变量 3.PATH环境变量 4.修改PATH环境变量配置文件 5.HOME环境变量 6.SHELL环境变量 7.PWD环境变…...

算法002——复写零

力扣——复写零点击即可跳转 这道题还是运用 双指针&#xff0c;我们从左往右开始&#xff0c;让 cur 0&#xff0c;dest 0,当我们循环时&#xff0c;会覆盖后面的值&#xff0c;所以从左到右无法实现&#xff0c;我们运用 从右到左的方式。 以示例一数组为例&#xff0c;从…...

例子 DQN + CartPole: 深入思考一下,强化学习确实是一场智能冒险之旅!

强化学习的概念 在技术人员眼里&#xff0c;深度学习、强化学习&#xff0c;或者是大模型&#xff0c;都只是一些算法。无论是简单&#xff0c;还是复杂&#xff0c;我们都是平静的看待。当商业元素日益渗透进技术领域&#xff0c;人人言必称大模型的时候。技术人该反思一下&a…...

java 实现xxl-job定时任务自动注册到调度中心

xxl-job 自动注册(执行器和任务) 前言 xxl-job是一个功能强大、简单易用、高可用且可扩展性强的分布式定时任务框架/分布式任务调度平台。它适用于各种需要定时任务调度的场景,并可根据业务需求进行灵活配置和扩展。 xxl-job简介 xxl-job是一个开源的分布式定时任务框架,…...

esp32串口通信

1、线路图 2、打开电脑的串口终端 3、eps32通过串口往电脑的串口终端输出信息&#xff1a; from machine import UART, Pin import time# 初始化UART0&#xff0c;波特率设置为115200 uart UART(0, baudrate115200, tx1, rx3)# 主循环 while True:# 要发送的消息#某些串口终…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...