AOP--拦截器

news2024/11/18 19:56:17

    • AOP应用--拦截器
    • Spring拦截器
    • 拦截器执行流程
    • 前缀的添加
    • 统一异常处理
    • 统一数据返回格式
    • 返回String类型

AOP应用–拦截器

AOP的作用:统一功能处理;我们将以三个内容作为学习的掌握点;而这三点也是我们非常迫切需要的
1:用户登录权限验证
2:统一异常处理
3:统一数据格式返回
如果我们利用上篇博客所介绍AOP的内容去实现这个功能会用些许的麻烦;1:环绕方法不好拿参数;没办法获取到HttpSession对象 2:拦截的规则容易定义;表达式不好写

Spring拦截器

拦截器是什么?
用于在某个操作或事件发生之前、之后或出现异常时拦截并进行额外的处理。
interceptor:拦截器;因为这是常用的框架;Spring就内置这个框架;Spring AOP是AOP的一种实现;而拦截器是AOP的一种实现。这里就和Spring AOP没什么关系;我们创建项目连Spring boot的AOP的依赖都不需要导入。

例如:实现登录权限效验(拦截器能解决Spring AOP问题;非常方便的拿到参数和拦截规则。)
步骤1:创建自定义拦截器;实现HandlerInterceptor接口的preHandle方法
在这里插入图片描述
在这里插入图片描述
我们就可以在这里面加入我们判断逻辑;看哪种情况是已经登录
在这里插入图片描述

步骤2:创建一个config层;将自定义拦截器加入到WebMvcConfigirer的addInterceptors方法(加入系统配置项;配置拦截规则。这个配置规则不就正好放到前面学习标准分层里配置项)
@Configuration 注解是 用于将一个类标识为配置类。配置类用于定义应用程序的配置信息;bean 的定义、依赖关系、设置等
在这里插入图片描述
测试效果:
创建控制层;通过控制层去访问URL;看是否被拦截
在这里插入图片描述
当配置剔除user/test路径下发生异常;拦截器依然会拦截
在这里插入图片描述
整体目录结构如下
在这里插入图片描述

拦截器执行流程

执行流程:
在这里插入图片描述
Controller 执⾏都会通过⼀个调度器 DispatcherServlet 来实现;控制台上有显示DispatcherServlet 信息(通过双击shift全局搜索就能查看详细)
在这里插入图片描述
在这里插入图片描述
所有⽅法都会执⾏ DispatcherServlet 中的 doDispatch 调度⽅法
在这里插入图片描述

在doDispatch 方法下面的判断;当拦截器没通过就返回;不会往下执行。
在这里插入图片描述
Spring 中的拦截器也是通过动态代理和环绕通知的思想实现的:
在这里插入图片描述

前缀的添加

当要进行分布式部署时;希望在之前所有的URl前置加个test
在这里插入图片描述
在这里插入图片描述
Lambda表达式 c -> true是将给定的c作为输入,始终返回true。无论c是什么值,该条件始终为真,也就是所有的RequestMappingInfo都会满足该条件。

统一异常处理

当服务器异常的时候;我们要有一个统一的返回处理;不能是单单返回状态码500;你得告诉前端是怎么回事;是什么原因导致的。
创建统一功能处理异常类
在这里插入图片描述
@ExceptionHandler(NullPointerException.class)是设置拦截的异常类型
@ControllerAdvice的用法基本是将其声明在某个bean上,在该bean的方法上使用其他的注解来指定不同的织入逻辑。ExceptionHandler(NullPointerException.class)结合用于捕获Controller中抛出的指定类型的异常。还有其它的搭配用法就不详细展开。
测试效果:
在这里插入图片描述
当你想处理所有的异常;而不单单是空指针异常;把NullPointerException改成父类Exception。如果我们有空指针异常的处理;又有父类的异常处理;有问题先找儿子的;找不到再找父母

统一数据返回格式

一般数据返回:状态、状态描述符、数据(1:简单些;2:方便写公共代码)
这是保底的;如果你乱写一通;把人家要返回的三条东西;你只写两条;这个写法就能帮你包装;让你的代码保底能对应上。不至于出现数据对应不上报错。
在这里插入图片描述
暂时认为:
在这里插入图片描述
当返回如下这种非标准的格式;那么我们就要进行修改
在这里插入图片描述
方法处理:supports、beforeBodyWrite
在这里插入图片描述
@SneakyThrows 是 Lombok 的一个注解,作用是在方法上自动添加对受检查异常的声明,以避免在代码中手动处理异常或者添加 throws 声明。
测试效果:
在这里插入图片描述

返回String类型

String的特殊;如果这里的int类型改成String则出问题:
在这里插入图片描述

当使用拦截器的异常处理时;发现确实是有问题

在这里插入图片描述在这里插入图片描述
执行流程:
1:方法返回String
2:数据返回前的处理(String Convert HashMap)
3:讲HashMap转成json字符串前端(这步hashmap转换成string出错)

问题原因:
第三步它会判断;本身body是啥;如果是string类型;会使用选择相应的消息转换器(StringHttpMessageConverter)进行转换。如果不是String;则使用HttpMessageConverter进行类型转换。
然后它拿一个hashmap去用这个string的转换器去转换;那就转换失败。

问题解决:
方案1:将StringHttpMessageConverter去掉。修改配置文件;当没有这个东西;它就会使用httpmessageconverter转换器去转换
创建一个配置项的层级;固定的写法;我们保存下来即可

package com.example.demo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class MyConfig implements WebMvcConfigurer {
    /**
     * 移除 StringHttpMessageConverter
     *
     * @param converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.removeIf(converter -> converter instanceof StringHttpMessageConverter);
    }
}

方案2:统一数据处理重写时;对String单独的逻辑处理;让其返回一个字符串;而不是HashMap
在这里插入图片描述
这样子自己拼接还是很容易拼错;spring 有内置jackson的一个工具
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Windows系统分区大小

Microsoft Reserved&#xff08;MSR&#xff09;——保留分区——16MB左右 EFI System Partition&#xff08;ESP&#xff09;——系统分区——100MB左右 Recovery Partition&#xff08;自起名字REP&#xff09;——恢复分区——450MB左右 其他分区——剩余

对rabbitmq进行压测

添加rabbitmq依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactI…

C# PaddleOCR标注工具

基于以下开源项目改造的 https://gitee.com/BaoJianQiang/FastOCRLabel 效果 Demo下载

CMake使用gRPC(Protobuf) 的c++ demo

gRPC的命令参数里&#xff0c; 1. 如果要用pacakge&#xff0c;需要--proto_path的参数&#xff0c; 例如helloworld.proto的绝对路径是 /home/user/grpc_demo_ws/grpc_demo/hello_world/proto/helloworld.proto 在helloworld.proto里面的pacakge是 package grpc_demo.hello_w…

同步(通信原理)

同步原理&#xff1a; 在通信系统中&#xff0c;同步是指发送端和接收端在时间上保持一致&#xff0c;使得接收端能够正确地解析和还原发送端发送的信号。同步的原理可以根据具体的通信系统和协议来区分&#xff0c;下面是几种常见的同步原理&#xff1a; 1. 时钟同步&#x…

uniapp 配置chooseLocation微信小程序腾讯地图选点

uniapp 配置chooseLocation微信小程序腾讯地图选点 场景 在uniapp中使用地图选点 搜索功能&#xff0c;回显功能&#xff0c;移动选点功能 使用到的API是uni.chooseLocation 详细看一下都有哪些属性 latitude &#xff1a;目标地纬度 Number longitude &#xff1a;目标地经度…

论文阅读: (CVPR2023 SDT )基于书写者风格和字符风格解耦的手写文字生成及源码对应

目录 引言SDT整体结构介绍代码与论文对应搭建模型部分数据集部分 总结 引言 许久不认真看论文了&#xff0c;这不赶紧捡起来。这也是自己看的第一篇用到Transformer结构的CV论文。之所以选择这篇文章来看&#xff0c;是考虑到之前做过手写字体生成的项目。这个工作可以用来合成…

浅析基于物联网技术的校园能耗智慧监控平台的设计及应用

摘 要&#xff1a;为打造低碳绿色校园&#xff0c;营造良好的学习环境&#xff0c;针对目前校园建筑能耗大&#xff0c;特别是空调节能困难等问题&#xff0c;特采用物联网技术构建校园建筑能耗智慧监控平台。通过设计空调监控子系统&#xff0c;搭建空调监控模型实现了空调等智…

在 Jetpack Compose 中使用 Snackbar

Jetpack Compose 是 Android 的现代 UI 工具库&#xff0c;提供了丰富的组件和功能来构建漂亮、交互丰富的用户界面。在本文中&#xff0c;我们将学习如何在 Jetpack Compose 中使用 Snackbar 组件来显示临时消息或操作反馈。 什么是 Snackbar&#xff1f; Snackbar 是一种用于…

基于Layui实现管理页面

基于Layui实现的后台管理页面&#xff08;仅前端&#xff09; 注&#xff1a;这是博主在帮朋友实现的一个简单的系统前端框架&#xff08;无后端&#xff09;&#xff0c;跟大家分享出来&#xff0c;可以直接将对应菜单跟html文件链接起来&#xff0c;页面使用标签页方式存在&…

面试了一个前阿里P7,Java八股文与架构核心知识简直背得炉火纯青

前几天&#xff0c;跟个老朋友吃饭&#xff0c;他最近想跳槽去大厂&#xff0c;觉得压力很大&#xff0c;问我能不能分享些所谓的经验套路。 每次有这类请求&#xff0c;都觉得有些有趣&#xff0c;不知道你发现没有大家身边真的有很多人不知道怎么面试&#xff0c;也不知道怎…

赛效:如何将PDF文件免费转换成Word文档

1&#xff1a;在网页上打开wdashi&#xff0c;默认进入PDF转Word页面&#xff0c;点击中间的上传文件图标。 2&#xff1a;将PDF文件添加上去之后&#xff0c;点击右下角的“开始转换”。 3&#xff1a;稍等片刻转换成功后&#xff0c;点击绿色的“立即下载”按钮&#xff0c;将…

win10修改IP地址报错:出现一个意外情况,不能完成所有你在......

问题描述 在修改网卡适配器的时候出现一下报错&#xff1a;出现一个意外情况&#xff0c;不能完成你在设置中所要求的更改 问题原因 该问题是由于我之前卸载VMware导致注册表出现问题。 解决方法 解决办法为:修复注册表(下载一个CCleaner下载试用版即可&#xff08;https…

2. 查询至少连续三天下单的用户

文章目录 题目需求思路一实现一思路二实现二 题目需求 查询订单信息表(order_info)中 最少连续3天 下单的用户id&#xff0c;期望结果如下&#xff1a; user_id101 订单信息表&#xff1a;order_info order_id(订单id)user_id(用户id)create_date (下单日期)total_amount(订…

MySQL 数据表修复方法

MySQL表检查与修复 — check/repair指令 目录 MySQL表检查与修复 --- check/repair指令1. 指令详解2. 操作方法&#xff1a;命令提示符(cmd指令)操作方法SQLyog 操作方法&#xff08;推荐&#xff09; 本文主要讲check table和repair table指令&#xff1b; 1. 指令详解 在检…

如何把图片转文字?图片转文字方法分享!​

如何把图片转文字呢&#xff1f;在我们日常的工作或者生活当中&#xff0c;总会遇到需要将图片中的文字提取出来整理出文档&#xff0c;比如同事领导给你发的文件&#xff0c;或者在自己看到了喜欢书的段落句子&#xff0c;想要摘抄下来&#xff0c;这些都是可以用图片转文字来…

C++ Vector容器使用方法详解

Vector概述 C 标准库向量类是序列容器的类模板。 向量以线性排列方式存储给定类型的元素&#xff0c;并允许快速随机访问任何元素。 向量是需要力求保证访问性能时的首选序列容器。vector是种容器&#xff0c;类似数组一样&#xff0c;但它的size可以动态改变。vector的元素在内…

【GESP】2023年06月图形化二级 -- 时间规划

文章目录 时间规划【题目描述】【输入描述】【输出描述】【参考答案】其他测试用例 时间规划 【题目描述】 默认小猫角色和白色背景&#xff0c;小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟。你能通过编程帮他做到吗&#xff1f; 【输入描述】 新建变量“…

餐饮市场分析(上)

阅读原文 研究某一类餐饮产品的市场概况&#xff0c;并在不同地区和品牌之间进行对比 一、数据需求 使用美团搜索商品返回的数据。 首先进入美团首页&#xff0c;切换到对应城市&#xff0c;并搜索感兴趣的关键词。接下来尝试翻页获取更多数据&#xff0c;点击下一页时发现页…

跨越时空限制,酷暑天气用VR看房是一种什么体验?

近年来&#xff0c;全球厄尔尼诺现象越来越频繁&#xff0c;夏季温度不断创下新高&#xff0c;持续大范围的高温天气让人们对出门“望而生畏”。很多购房者也不愿意在如此酷暑期间&#xff0c;四处奔波看房&#xff0c;酷暑天气让带看房效率大大降低&#xff0c;更有新闻报道&a…