【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环境中的资源

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

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

相关文章

.net开源商城_C#开源商城源码_.netcore开源商城多少钱

在现今的电子商务领域&#xff0c;开源商城系统为企业和开发者提供了丰富的选择和可能性。其中&#xff0c;.NET开源商城、C#开源商城源码以及.NET Core 开源商城备受关注。然而&#xff0c;对于这些开源商城的价格问题&#xff0c;往往是人们在选择时需要重点考虑的因素之一。…

Java并发编程之ConcurrentHashMap的原理和使用

ConcurrentHashMap(CHM)是Java为解决高并发场景下哈希表性能瓶颈而设计的线程安全容器,其核心目标在于: 线程安全‌:避免多线程操作导致的数据不一致问题‌;高吞吐量‌:通过细粒度锁和无锁化设计降低线程竞争‌;动态扩展‌:支持自动扩容与数据结构优化(如链表转红黑树…

问题修复-后端返给前端的时间展示错误

问题现象&#xff1a; 后端给前端返回的时间展示有问题。 需要按照yyyy-MM-dd HH:mm:ss 的形式展示 两种办法&#xff1a; 第一种 在实体类的属性上添加JsonFormat注解 第二种&#xff08;建议使用&#xff09; 扩展mvc框架中的消息转换器 代码&#xff1a; 因为配置类继…

《基于 LIME 的低照度图像处理》开题报告

目录 一、研究目的和意义 1.研究目的 2.研究意义 二、国内外研究现状和发展趋势 三、研究内容、研究方法及可行性分析 1、研究内容 2、研究方法 3、可行性分析 四、项目特色与创新点 1、面向特定应用场景的针对性研究 1.多算法比较与选择的严谨性 2.基于硬件平台的深…

【Linux文件IO】系统IO详情

目录 一、前言 二、相关API介绍 2.1 open 2.2 read 2.3 write 2.4 lseek 2.5 close 三、简单示例 3.1 示例1 3.2 示例2 一、前言 在 Linux 系统编程中&#xff0c;系统 I/O&#xff08;又称低级 I/O&#xff09;是直接通过操作系统提供的系统调用实现的文件操作接口…

MATLAB代码:机器学习-分类器

本文包含三种机器学习分类器的MATLAB实现方式代码块&#xff1a;支持向量机、决策树、逻辑回归。 目录 SVM/支持向量机(Support Vector Machine) 原理 MATLAB实现 实例代码块 采用搜索确定参数 Decision Tree / 决策树 原理 MATLAB实现 实例代码块 Logistic Regressio…

DeepSeek赋能数据治理:数字转型智慧引擎,企业数治的全新解决方案

在数字化时代&#xff0c;数据已成为企业的核心资产&#xff0c;而数据治理则是企业实现数字化转型的关键环节。然而&#xff0c;传统数据治理面临着诸多挑战&#xff0c;如数据孤岛、数据质量参差不齐、治理效率低下等。 如今&#xff0c;随着人工智能技术的飞速发展&#xf…

火山引擎AI一体机-DeepSeek版来了

2025年伊始&#xff0c;DeepSeek 在各领域尽显其能。除常态公有云部署外&#xff0c;一些企业也希望将 DeepSeek 与本地数据、业务场景相融合&#xff0c;拥抱 AI 新未来。不过&#xff0c;算力基础设施缺失、模型交付周期长、推理性能不足、数据安全合规等技术和成本问题成为了…

Hadoop之02:MR-图解

1、不是所有的MR都适合combine 1.1、map端统计出了不同班级的每个学生的年龄 如&#xff1a;(class1, 14)表示class1班的一个学生的年龄是14岁。 第一个map任务&#xff1a; class1 14 class1 15 class1 16 class2 10第二个map任务&#xff1a; class1 16 class2 10 class…

IP属地是通过卫星定位的吗?如何保护用户隐私

在数字时代&#xff0c;网络空间成为了人们日常生活不可或缺的一部分。随着社交媒体、在线服务等平台的兴起&#xff0c;用户IP属地信息的重要性日益凸显。然而&#xff0c;关于IP属地是如何确定的&#xff0c;尤其是是否通过卫星定位这一问题&#xff0c;却常常引发公众的疑问…

20250225-代码笔记03-class CVRPModel AND other class

文章目录 前言一、class CVRPModel(nn.Module):__init__(self, **model_params)函数功能函数代码 二、class CVRPModel(nn.Module):pre_forward(self, reset_state)函数功能函数代码 三、class CVRPModel(nn.Module):forward(self, state)函数功能函数代码 四、def _get_encodi…

操作系统之文件系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Linux操作系统5- 补充知识(可重入函数,volatile关键字,SIGCHLD信号)

上篇文章&#xff1a;Linux操作系统5-进程信号3&#xff08;信号的捕捉流程&#xff0c;信号集&#xff0c;sigaction&#xff09;-CSDN博客 本篇Gitee仓库&#xff1a;myLerningCode/l26 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 可重入…

Bandicam录屏软件,设置延时录制

Bandicam软件&#xff0c;又称班迪录屏&#xff0c;是一款简单好用的电脑屏幕录制软件&#xff0c;既可以录制PPT课程视频、网课视频&#xff0c;还可以游戏攻略视频等。该软件专门用来录制电脑的桌面视频&#xff0c;目前支持2种视频文件格式&#xff1a;avi和mp4。支持全屏或…

利用@WebMvcTest测试Spring MVC应用

文章目录 1. WebMvcTest概述2. 创建Spring Boot项目3. 创建主页控制器类4. 准备图片素材5. 创建主页模板视图6. 主页控制器测试类 6.1 创建主页控制器测试类6.2 运行单元测试方法 7. 启动应用&#xff0c;查看结果 7.1 启动应用7.2 访问项目首页 8. 实战小结 1. WebMvcTest概…

Java8面试

Java 8 有哪些新特性? &#x1f40e;Java 8五大神装特性&#x1f40e; Lambda表达式&#xff08;魔法调料&#xff09; 曼波觉得像速食魔法咒语&#xff01;(๑✧◡✧๑) // 传统写法&#xff08;像冗长菜谱&#xff09; new Thread(new Runnable() {public void run() {Syst…

【前端基础】Day 7 CSS高级技巧

目录 1. 精灵图 1.1 为什么需要精灵图 1.2 精灵图&#xff08;sprites&#xff09;的使用 2. 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 2.4 字体图标的引入 2.5 字体图标的追加 3. CSS三角形 4. CSS用户界面样式 4.1 更改用户鼠标样式 …

初步理解RNN和LSTM

RNN RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种能够处理序列数据的神经网络。这里的时序信息可以指例如对于这一句话 “我吃了一个苹果”&#xff0c;“苹果” 的词性和意思&#xff0c;在这里取决于前面词的信息&#xff0c;如果没…

【华为OD机考】华为OD笔试真题解析(18)--找出通过车辆最多的颜色

题目描述 在一个狭小的入口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出N秒内经过的最多颜色的车辆数量&#xff0c;三种颜色编号为0、1、2。 输入描述 第一行输入的是通过的车辆颜色信息&#xff0c;[0,1,1,2]代表4秒钟通过的车辆颜色…

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…