异常随笔xx1

关于过滤器和拦截器

看一下过滤器,过滤器我们可以分两步:

1.配置自定义过滤器

2.过滤器注册

这样它才会生效,拦截器也如此

先配置:

@RequiredArgsConstructor
public class UserTransmitFilter implements Filter {private final StringRedisTemplate stringRedisTemplate;@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;String requestURI = httpServletRequest.getRequestURI();//如果不是登录路径 要验证if(!Objects.equals(requestURI,"/api/short-link/v1/user/login")) {String username = httpServletRequest.getHeader("username");String token = httpServletRequest.getHeader("token");Object JsonStrUserDO = stringRedisTemplate.opsForHash().get("login_" + username, token);UserDO userInfoJsonstr = JSONUtil.toBean((String) JsonStrUserDO, UserDO.class);if (userInfoJsonstr != null) {UserInfoDTO userInfoDTO = BeanUtil.copyProperties(userInfoJsonstr,UserInfoDTO.class);userInfoDTO.setUserId(userInfoJsonstr.getId().toString());UserContext.setUser(userInfoDTO);}}try {filterChain.doFilter(servletRequest, servletResponse);} finally {UserContext.removeUser();}}
}

再注册:

@Configuration
public class UserConfiguration {/*** 用户信息传递过滤器*/@Beanpublic FilterRegistrationBean<UserTransmitFilter> globalUserTransmitFilter(StringRedisTemplate stringRedisTemplate) {FilterRegistrationBean<UserTransmitFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new UserTransmitFilter(stringRedisTemplate));registration.addUrlPatterns("/*");registration.setOrder(0);return registration;}
}

我们也可以这样注册:

@RequiredArgsConstructor
@Configuration
public class UserConfigurationMvc extends WebMvcConfigurationSupport {private final StringRedisTemplate stringRedisTemplate;@Beanpublic FilterRegistrationBean<UserTransmitFilter> globalUserTransmitFilter(StringRedisTemplate stringRedisTemplate) {FilterRegistrationBean<UserTransmitFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new UserTransmitFilter(stringRedisTemplate));registration.addUrlPatterns("/*");registration.setOrder(0);return registration;}
}

这两种方式都可以用来注册过滤器,但是它们放在不同的配置类中,作用域和目的有所不同:

  1. 第一个配置类UserConfiguration

    • 在这里直接定义了一个FilterRegistrationBean的Bean,用于注册UserTransmitFilter过滤器。
    • 由于没有明确指出这是一个MVC配置类,这个过滤器将会在整个应用程序范围内生效,不仅仅局限于Spring MVC相关的HTTP请求。
  2. 第二个配置类UserConfigurationMvc:

    • 这个配置类继承自WebMvcConfigurationSupport,表明它是专门针对Spring MVC的定制配置类。
    • 在这个类中同样定义了一个同名的FilterRegistrationBean的Bean,用于注册UserTransmitFilter过滤器。
    • 因为它是一个MVC相关的配置类,所以这里的过滤器主要应用于Spring MVC处理的HTTP请求。

拦截器如此:

拦截器实现HandlerInterceptor接口,重写preHandle方法,放行就return true 不然就返回false

@Component
@Slf4jpublic class JwtTokenAdminInterceptor implements HandlerInterceptor {@Autowiredprivate JwtProperties jwtProperties;/*** 校验jwt** @param request* @param response* @param handler* @return* @throws Exception*/public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//判断当前拦截到的是Controller的方法还是其他资源if (!(handler instanceof HandlerMethod)) {//当前拦截到的不是动态方法,直接放行return true;}//1、从请求头中获取令牌String token = request.getHeader(jwtProperties.getAdminTokenName());//2、校验令牌try {log.info("jwt校验:{}", token);Claims claims = JwtUtil.parseJWT(jwtProperties.getAdminSecretKey(), token);Long empId = Long.valueOf(claims.get(JwtClaimsConstant.EMP_ID).toString());log.info("当前员工id:{}", empId);BaseContext.setCurrentId(empId);//3、通过,放行return true;} catch (Exception ex) {//4、不通过,响应401状态码response.setStatus(401);return false;}}
}

然后注册拦截器:

@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {@Autowiredprivate JwtTokenAdminInterceptor jwtTokenAdminInterceptor;/*** 注册自定义拦截器** @param registry*/protected void addInterceptors(InterceptorRegistry registry) {log.info("开始注册自定义拦截器...");registry.addInterceptor(jwtTokenAdminInterceptor).addPathPatterns("/admin/**").excludePathPatterns("/admin/employee/login");
}

 WebMvcConfigurationSupport是 Spring Framework 提供的一个类,它主要用于提供基础的 Spring MVC 配置支持。在 Spring Boot 中,Spring Boot 自动配置了大量的 Spring MVC 组件,但是如果开发者需要进行更细粒度的自定义配置,例如自定义拦截器、过滤器、视图解析器、消息转换器等,就可以通过扩展WebMvcConfigurationSupport 类来达到目的。

关于全局异常拦截器

全局异常拦截器是一种用于捕获应用程序中所有未被处理的异常的技术。通过使用全局异常拦截器,我们可以捕获应用程序中的所有未被处理的异常,并在拦截器中统一处理这些异常。这样可以避免因未处理的异常导致的程序崩溃,提高程序的稳定性和可靠性。

自定义异常处理

自定义异常类通常继承RuntimeException或者Exception。通过自定义异常,更准确的表达错误情况。

1.比如这样(自定义异常):

public class BaseException extends RuntimeException {public BaseException() {}public BaseException(String msg) {super(msg);}}

2.可以再定义异常类去基础它来,更加详细的描述:

2.1比如这个密码错误的异常

public class PasswordErrorException extends BaseException {public PasswordErrorException(String msg) {super(msg);}}

2.2这个删除异常:

public class DeletionNotAllowedException extends BaseException {public DeletionNotAllowedException(String msg) {super(msg);}}

3.然后全局异常处理去处理它:

/*** 全局异常处理器,处理项目中抛出的业务异常*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/*** 捕获业务异常* @param ex* @return*/@ExceptionHandler(BaseException.class)public Result exceptionHandler(BaseException ex){log.error("异常信息:{}", ex.getMessage());return Result.error(ex.getMessage());}
}

第二步,为了标准的表达,自己写的话,当然是方便可以省略啦!

当然,开发还有更规范的异常定义处理

泰山版Java开发手册-阿里云开发者社区 (aliyun.com)icon-default.png?t=N7T8https://developer.aliyun.com/topic/java2020?accounttraceid=828f944f482f41ba8661a513cee61912inde

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

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

相关文章

裁员潮下,打工人的自我修养

法律规定的 裁员补偿&#xff1a; 1、平等协商解除的&#xff0c;底线是N1&#xff0c;上限能谈多少法律都支持 2、有客观原因解除的&#xff0c;是N1 3、强制违法辞退的&#xff0c;是2N Tips&#xff1a;基数是每月的全额税前工资&#xff0c;包括奖金绩效等&#xff0c…

strstr的模拟实现

一&#xff1a;strstr函数的定义&#xff1a; strstr函数功能的解释&#xff1a; 在一个字符串里面寻找另一个字符串的首次出现位置&#xff0c;返回值为该位置。 strstr函数要点&#xff1a; 1&#xff0c;如果 str2 是 str1 的一部分&#xff0c;它返回一个指向 str1 中 …

2024.3.15

1.单向循环链表 代码&#xff1a; #include"loop.h" //创建单向循环链表 loop_p create_loop_list() {loop_p H (loop_p)malloc(sizeof(loop));if(HNULL){printf("空间申请失败\n");return NULL;}H->len0;H->nextH;return H; } //创建节点 loop_p…

【C语言】打印用*组成的X形图案

代码如下&#xff1a; #include<stdio.h> int main() { int n 0; int i 0; int j 0; while (scanf("%d", &n) ! EOF) for (i 0; i < n; i) { for (j 0; j < n; j) { if (…

拼多多根据关键词取商品列表 API 返回值说明

一、应用场景 拼多多根据关键词取商品列表的API应用场景非常广泛&#xff0c;主要集中在电商领域&#xff0c;包括但不限于以下几个方面&#xff1a; 1、商品搜索与推荐&#xff1a;商家可以通过API接口&#xff0c;根据用户输入的关键词&#xff0c;实时获取拼多多平台上的相…

什么是布隆过滤器?

1、什么是布隆过滤器 ​ 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多&#xff0c;缺…

Java习题中 哈希表的理论 有效的字母异位词 快乐数 两数之和

关于 哈希表的理论 今天最大的疑惑好像就是map的复杂度怎么算哈哈,一般n个元素map的复杂度就是On哦,不需要想得太复杂了,冲突的空间并不会造成一个量级,改变n前面的常数不会影响空间复杂度哈提醒&#xff01;熟悉好map,set的API哦 关于 有效的字母异位词 为什么遍历第二个字符…

小白必看的Python基础之函数篇

函数最重要的目的是方便我们重复使用相同的一段程序。 将一些操作隶属于一个函数&#xff0c;以后你想实现相同的操作的时候&#xff0c;只用调用函数名就可以&#xff0c;而不需要重复敲所有的语句。 函数的定义 首先&#xff0c;我们要定义一个函数, 以说明这个函数的功能…

BufferedOutputStream类讲解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java IO相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.16 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1&#xff1a;组合总和&#xff1b;2&#xff1a;电话号码的字母组合 216.组合总和III17.电话号码的字母…

【Redis知识点总结】(五)——Redis实现分布式锁

Redis知识点总结&#xff08;五&#xff09;——Redis实现分布式锁 setnxsetnx expiresetnx expire lua脚本set nx exset nx ex 随机值set nx ex 随机值 lua脚本set ex nx 随机值 lua脚本 锁续期RedissonRedLock 在Redis的众多应用场景中&#xff0c;分布式锁是Redis比…

解决分布式事务,Seata真香!

年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验等…

纯 CSS 实现文字换行环绕效果

实现效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><…

Windows10中配置并使用nvidia-smi

1. 问题 当在window10系统中使用nvidia-smi命令时&#xff1a; 会得到提示&#xff1a;nvidia-smi不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 注&#xff1a;其实安装NVIDIA控制面板时&#xff0c;软件已内置安装了nvidia-smi.exe&#xff0c;我们只需…

如何彻底删除Windows10系统D盘文件夹中的DeliveryOptimization

DeliveryOptimization是传递优化创建的文件夹。Windows 10的Delivery Optimization&#xff08;传递优化&#xff09;功能是用于加快下载Windows更新及其他Microsoft Store应用程序的速度的一种技术。Delivery Optimization使用了一个名为“DeliveryOptimization”&#xff08;…

zookeeper快速入门五:用zookeeper实现服务注册与发现中心

系列&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 zookeeper快速入门四&#xff1a;在java客户端中操作zookeeper-CSDN博客…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:TabContent)

仅在Tabs中使用&#xff0c;对应一个切换页签的内容视图。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 可内置系统组件和自定义组件&#xff0c;支…

运用html相关知识编写导航栏和二级菜单

相关代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

Java代码审计安全篇-CSRF漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

[嵌入式系统-40]:龙芯1B 开发学习套件 -10-PMON启动过程start.S详解

目录 一、龙芯向量表与启动程序的入口&#xff08;复位向量&#xff09; 1.1 复位向量&#xff1a; 1.2 代码执行流程 1.3 计算机的南桥 VS 北桥 二、PMON代码执行流程 三、Start.S详解 3.1 CPU初始化时所需要的宏定义 &#xff08;1&#xff09;与CPU相关的一些宏定义…