SpringBoot:SpringBoot:实战项目TILAS智能学习辅助系统1.3

登录认证

需求:输入登录请求服务器判断用户的用户名和密码
//控制层
@PostMapping("/login")public Result login(@RequestBody Emp emp);@Overridepublic Result login(Emp emp) {Emp emp1 = empService.selectLogin(emp);if(emp1 == null){System.out.println("用户名或密码错误");return Result.error("登录失败");}else{System.out.println("登录成功");Map<String,Object> map = new HashMap<>();map.put(emp1.getUsername(),emp1.getPassword());String secret = JWTUtils.generateJwt(map);return Result.success(secret);}}//业务层
Emp selectLogin(Emp emp);@Overridepublic Emp selectLogin(Emp emp) {return empMapper.selectLogin(emp);}//持久层
@Select("select * from emp where username = #{username} and password = #{password}")Emp selectLogin(Emp emp);

过滤:

如果没有过滤,用户可以直接通过链接直接访问功能,绕过登录.

所以我们需要

将登录成功的信息进行保存和封装记录成为登录成功的标记.

进行判断和拦截

使用

Filter过滤器和Interceptor拦截器

但是因为HTTP是无状态的,不能在多次请求之间共享数据,所以我们需要使用会话跟踪技术解决

会话跟踪技术解决

会话:

用户打开浏览器,访问web服务器的资源,会话建立,直到一方断开连接结束会话.

在一次会话中可以包含多次请求和响应

从浏览器发出请求到服务端,服务端再响应数据给前端,就完成了一次会话的建立

如果建立会话后,浏览器和服务端都没有被关闭,就会持续会话直到一方结束

中途可以一直使用该会话进行请求的发送和响应

会话跟踪:

一种维护浏览器的方法,服务器需要识别多次请求是否来自于同一浏览器,以便于在同一次会话的多次请求间共享数据

服务器会收到多个请求,多个请求可能来自于多个浏览器

所以浏览器需要进行以下操作

使用会话跟踪来进行识别
识别请求是否来自于同一个浏览器
识别浏览器后在同一个会话中多次请求间共享数据
实现会话跟踪
客户端会话跟踪技术:Cookie
服务端会话跟踪技术:Session

都可以实现会话跟踪,但Cookie存储在浏览器端,而Session是存储在服务端

请求时创建唯一id的session保存在服务端,响应时封装成cookie在响应头中返回给客户端

请添加图片描述


传统会话跟踪的问题(服务器集群,客户端多样化)
服务器集群:

服务器的并发访问量有限,需要通过代理服务器来分配访问给多个服务器(集群中数据无法共享)

问题主要体现在两个方面

服务器集群环境下Session的共享问题
移动端APP端无法使用Cookie

所以我们使用

令牌技术

登录请求时,如果登录成功可以给前端响应一个令牌(一个特殊的字符串,代表每个用户合法的身份凭证)

前端将登录返回的令牌记录下来保存在自己的客户端

在后续的请求中每次请求都会携带该令牌,在之后服务端使用Filter或Interceptor对所有请求进行拦截并校验,获取请求中携带的令牌进行判断,如果合法就放行,如果不合法就返回错误信息并跳转到登录页面.

解决了集群环境下的认证问题,减轻服务器的存储压力
支持PC端,移动端

JWT令牌

JSON Web Token

一个开发的行业标准,定义了一种简介的,自包含的协议格式,用于在通信双方传递JSON对象,传递的信息经过数字签名可以被验证和信任.

分为三个部分

Header(头)

记录令牌类型,签名算法等,使用Base64编码

Payload(有效载荷)

携带用户信息和过期信息,使用Base64编码

Signature(签名)

防止Token被篡改,确保安全性,是一个字符串

使用秘钥加密

校验时的签名秘钥必须与生成令牌时的秘钥一致.
如果JWT令牌解析校验时报错,说明JWT令牌被篡改或失效了,令牌非法.

使用json进行数据传输,通用型广泛,体积小,便于传输

无需在服务器端保存相关信息

jwt载荷部分可以存储业务相关信息(不能是敏感信息)

生成令牌

public class JWTUtils {private static String signKey = "cfjg";
//    private static Long expire = 43200000L;public static String generateJwt(Map<String,Object> claims){//生成令牌String jwt = Jwts.builder().addClaims(claims)//添加数据.signWith(SignatureAlgorithm.HS256,signKey)//设置算法.setExpiration(new Date(System.currentTimeMillis() + 1000L*3*60))//设置过期时间.compact();//生成return jwt;}public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey)//设置秘钥.parseClaimsJws(jwt)//解析令牌.getBody();//获取数据return claims;}
}

过滤器Filter

JavaWeb三大组件之一(Servlet,Filter,Listener)

底层使用动态代理,对请求进行拦截和处理

对token进行判断和解析,如果失败就跳转回login,如果成功就正常访问

public class Filter implements javax.servlet.Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//请求对象,响应对象,拦截对象HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;String url = httpServletRequest.getRequestURI();System.out.println(url);if(url.matches(".?login.?")){System.out.println("login:登录页面");filterChain.doFilter(httpServletRequest,httpServletResponse);return;}else{String token = httpServletRequest.getHeader("token");if(token == null || token.equals("")){httpServletResponse.getWriter().write(JSONObject.toJSONString(Result.error("NOT_LOGIN")));System.out.println("令牌错误");return;}try{JWTUtils.parseJWT(token);System.out.println("令牌正确");filterChain.doFilter(httpServletRequest,httpServletResponse);return;}catch (Exception e){
//                filterChain.doFilter(httpServletRequest,httpServletResponse);httpServletResponse.getWriter().write(JSONObject.toJSONString(Result.error("NOT_LOGIN")));System.out.println("令牌错误");return;}}}
}

Interceptor拦截器

注册拦截器
@Configuration
public class InterceptorRegist implements WebMvcConfigurer {//注册拦截器@AutowiredLoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}
使用拦截器
package com.example.tlias.Interceptor;import com.alibaba.fastjson.JSONObject;
import com.example.tlias.pojo.Result;
import com.example.tlias.util.JWTUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {//过滤前String url = httpServletRequest.getRequestURI();System.out.println(url);if(url.matches(".?login.?")){System.out.println("interceptor running");return true;//放行}else{String token = httpServletRequest.getHeader("token");if(token == null || token.equals("")){httpServletResponse.getWriter().write(JSONObject.toJSONString(Result.error("NOT_LOGIN")));System.out.println("interceptor running");return false;//拦截}try{JWTUtils.parseJWT(token);System.out.println("interceptor running");return true;}catch (Exception e){
//                filterChain.doFilter(httpServletRequest,httpServletResponse);httpServletResponse.getWriter().write(JSONObject.toJSONString(Result.error("NOT_LOGIN")));System.out.println("interceptor running");return false;}}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {//过滤后System.out.println("方法执行结束");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//请求结束System.out.println("请求结束");}
}

Filter和Interceptor的区别

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

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

请添加图片描述

异常处理

在SpringBoot项目中的异常如果从控制层向上抛出会暴露给用户,这是不被允许的.

处理异常的方案

1,在Controller中使用trycatch进行处理(过于冗长)

2,全局异常处理器(推荐)

由SpringMVC提供,接收所有Controller中产生的异常,一般在exception包下定义

@RestControllerAdvice//相当于@ResponseBody+@ControllerAdvice
public class GlobalExceptionHandler {//全局异常处理器@ExceptionHandler(Exception.class)//接收需要处理的异常的字节码文件public Result exceptionHandler(Exception exception){return Result.error(exception.getMessage());}
}

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

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

相关文章

虚拟化技术 使用Vsphere Client管理ESXi服务器系统

使用Vsphere Client管理ESXi服务器系统 一、实验目的与要求 1.掌握使用vSphere Client管理ESXi主机 2.掌握将CentOS的安装介质ISO上传到ESXi存储 3.掌握在VMware ESXi中创建虚拟机 4.掌握在所创建的虚拟机中安装CentOS6.5操作系统 5.掌握给CentOS6.5安装VMware Tools 6.掌…

uniapp0基础编写安卓原生插件之编写安卓页面在uniapp上显示(摄像头调用)

前言 如果你对安卓插件开发部分不熟悉你可以先看uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件 效果 开始 dcloud_uniplugins.json {"nativePlugins": [{"hooksClass": "","plugins": [{&…

【qt】核心机制信号槽(下)

这里写目录标题 自定义的信号自定义的槽自定义的信号和槽的结合使用信号和槽的断开总结&#xff1a; 自定义的信号 信号就是一个函数声明 前面咱们都用的qt组件自带的信号&#xff0c;接下来我们自己写一个信号。 信号只需要在前面加一个signals即可 这个函数不需要实现 参数传…

Grounded-Segment-Anything实现自动文本标注

项目地址&#xff1a;IDEA-Research/Grounded-Segment-Anything: Grounded-SAM: Marrying Grounding-DINO with Segment Anything & Stable Diffusion & Recognize Anything - Automatically Detect , Segment and Generate Anything (github.com) demo地址&#xff1a…

Blender材质,纹理,UV

1.材质Material&#xff0c;用于描述物体的表面性质&#xff0c;包含以下基本属性 -基础色 -金属/非金属 -粗糙度 -透光度 -凹凸细节 添加材质步骤&#xff1a; 1&#xff09;切换到材质预览模式 2&#xff09;打开材质面板 3&#xff09;添加一个材质&#xff0c;包括材…

PostgreSQL(十二)报错:Tried to send an out-of-range integer as a 2-byte value: 51000

目录 一、报错场景二、源码分析三、实际原因&#xff08;更加复杂&#xff09;四、解决思路 一、报错场景 今天写了一个历史数据处理程序&#xff0c;在开发环境、测试环境都可以正常执行&#xff0c;但是放到生产环境上就不行&#xff0c;报了一个这样的错误&#xff1a; or…

信息系统项目管理师0095:项目管理知识领域(6项目管理概论—6.4价值驱动的项目管理知识体系—6.4.4项目管理知识领域)

点击查看专栏目录 文章目录 6.4.4项目管理知识领域6.4.4项目管理知识领域 除了过程组,过程还可以按知识领域进行分类。知识领域指按所需知识内容来定义的项目管理领域,并用其所含过程、实践、输入、输出、工具和技术进行描述。 虽然知识领域相互联系,但从项目管理的角度来看…

SparkSQL数据源

目录 第1关&#xff1a;SparkSQL加载和保存 任务描述 相关知识 加载数据 直接在文件上运行SQL 保存到路径 保存模式介绍 保存到持久表 存储和排序或分区 编程要求 测试说明 第2关&#xff1a;Parquet文件介绍 任务描述 相关知识 编程方式加载Parquet文件 Parquet分区 结构合并 …

Canvas实现画板

Canvas如何实现画板功能。 <!DOCTYPE html> <html> <head><title>Canvas 画板</title><style>canvas {border: 1px solid black;}</style> </head> <body><canvas id"canvas" width"800" heig…

第41天:WEB攻防-ASP应用HTTP.SYS短文件文件解析Access注入数据库泄漏

第四十一天 一、ASP-SQL注入-Access数据库 1.解释 ACCESS数据库无管理帐号密码&#xff0c;顶级架构为表名&#xff0c;列名&#xff08;字段&#xff09;&#xff0c;数据&#xff0c;所以在注入猜解中一般采用字典猜解表和列再获取数据&#xff0c;猜解简单但又可能出现猜解…

flask和django的对比

文章目录 1. 简介2. 安装和设置3. 路由和视图4. ORM5. 管理界面6. 社区和文档7. 性能结论 当涉及构建 Web 应用程序时&#xff0c;Flask 和 Django 是两个最受欢迎的 Python Web 框架之一。它们都提供了强大的工具和功能&#xff0c;但在某些方面却有所不同。本文将对 Flask 和…

Vue-路由介绍

目录 一、思考引入 二、路由介绍 一、思考引入 单页面应用程序&#xff0c;之所以开发效率高&#xff0c;性能高&#xff0c;用户体验好&#xff0c;是因为页面按需更新。 而如果要按需更新&#xff0c;首先需要明确&#xff1a;访问路径和组件的对应关系。该关系通过路由来…

microsoft的azure语音,开发环境运行正常,发布到centos7线上服务器之后,无法运行

最近在做AI语音对话的功能&#xff0c;用到了azure的语音语音服务&#xff0c;开发的时候还算顺利&#xff0c;部署到线上后&#xff0c;发现在正式服上无法完成语音转文本的操作&#xff0c;提示&#xff1a; org.springframework.web.util.NestedServletException: Handler d…

数字图像处理知识点

数字图像处理知识点 一、绪论1、数字图像处理相关概念2、数字图像处理流程1.3 数字图像处理主要研究内容二、视觉与色度基础1、图像传感器与二维成像原理2、三基色2.1 三基色原理2.2 亮度方程3、HSI模型3.1 HSI模型优点3.2 RGB到HSI转换三、数字图像处理基础1、图像的数字化及表…

linux Shell编程之条件语句

条件测试操作 test命令 条件测试操作 Shell环境根据命令执行后的返回状态值&#xff08;$?&#xff09;来判断是否执行成功&#xff0c;当返回值为0&#xff08;真true&#xff09;时表示成功&#xff0c;返回值为非0值&#xff08;假false&#xff09;时表示失败或异常。 t…

C++ | Leetcode C++题解之第77题组合

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> temp;vector<vector<int>> ans;vector<vector<int>> combine(int n, int k) {// 初始化// 将 temp 中 [0, k - 1] 每个位置 i 设置为 i 1&#xff0c;即 [0, k - 1] 存…

如何在您的域名中使用 Google Apps 创建 SPF 记录

关于 SPF 记录 SPF 记录是一种域名服务&#xff08;DNS&#xff09;记录&#xff0c;用于标识哪些邮件服务器被允许代表您的域发送电子邮件。它与在您的 DNS 区域中添加 MX 或 A 记录一样简单。 为什么它很重要&#xff1f; 如今&#xff0c;几乎所有滥用电子邮件消息都携带…

OpenSPG docker 安装教程

文章目录 前言自述 一、OpenSPG1.介绍 二、安装步骤1.安装服务端2.客户端部署 前言 自述 我最近是想结合chatglm3-6b和知识图谱做一个垂直领域的技术规范的问答系统&#xff0c;过程中也遇到了很多困难&#xff0c;在模型微调上&#xff0c;在数据集收集整理上&#xff0c;在知…

面向侧扫声纳目标检测的YOLOX-ViT知识精馏

面向侧扫声纳目标检测的YOLOX-ViT知识精馏 摘要IntroductionRelated WorkYOLOv-ViTKnowledge DistillationExperimental Evaluation Knowledge Distillation in YOLOX-ViT for Side-Scan Sonar Object Detection 摘要 在本文中&#xff0c;作者提出了YOLOX-ViT这一新型目标检测…

Sealos急速部署生产用k8s集群

最近一段时间部署k8s全部使用sealos了&#xff0c;整体使用感觉良好&#xff0c;基本没有什么坑。推荐给大家。 使用 Sealos&#xff0c;可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书&#xff0c;用到我跑路是足够了。不用像之前kubeadm安装…