SpringBoot-全局处理异常,时间格式,跨域,拦截器,监听器

1.全局异常处理

使用ControllerAdvice与ExceptionHandler注解

/*** 全局异常处理程序** @author * @date */
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public JsonResult handleException(Exception e) {e.printStackTrace();return JsonResult.error(e.getMessage());}/*** 处理业务异常** @param e* @return {@link JsonResult}*/@ExceptionHandler(BusinessException.class)public JsonResult handleBusinessException(BusinessException e) {e.printStackTrace();return JsonResult.error(e.getMessage());}/*** handle 方法参数无效异常** @param e e* @return {@link JsonResult}*/@ExceptionHandler(MethodArgumentNotValidException.class)public JsonResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {e.printStackTrace();return JsonResult.error(e.getBindingResult().getFieldError().getDefaultMessage());}}

2.全局时间格式处理

配合第一种@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")联合使用了,哪些字段需要特殊对待的,就可以单独使用这个@JsonFormat注解进行处理了。

  • 如果是后台接收前端的时间数据,前端传递string类型的时间数据,后端要转换成的Date类型数据,可以使用@DateTimeFormat注解来接收参数
  • 如果后端向前端传递数据,默认是返回时间戳,如果想要优雅的格式,可以在模型的Date字段或get方法上使用@JsonFormat注解,这个注解上可以指定时间格式和时区
/*** @description: 日期时间全局格式化* @auth: wujiangbo* @date: 2022-03-09 17:38*/
@JsonComponent
public class LocalDateTimeSerializerConfig {@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")private String pattern;/*** Date 类型全局时间格式化*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilder() {return builder -> {TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");//获取时区DateFormat df = new SimpleDateFormat(pattern);//设置格式化模板df.setTimeZone(tz);builder.failOnEmptyBeans(false).failOnUnknownProperties(false).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).dateFormat(df);}; }/*** LocalDate 类型全局时间格式化*/@Beanpublic LocalDateTimeSerializer localDateTimeDeserializer() {return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));}@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());}
}

3.跨域问题

@Configuration
/*** 告诉浏览器,我允许哪些服务器访问,哪些请求方式访问,是否运行携带请求头*/
public class GlobalCorsConfig {@Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息CorsConfiguration config = new CorsConfiguration();//2.允许的域,不要写*,否则cookie就无法使用了//config.addAllowedOriginPattern("*");config.addAllowedOriginPattern("http://127.0.0.1:8081");config.addAllowedOriginPattern("http://localhost:8081");config.addAllowedOriginPattern("http://127.0.0.1:80");config.addAllowedOriginPattern("http://localhost:80");config.addAllowedOriginPattern("http://127.0.0.1");config.addAllowedOriginPattern("http://localhost");//3.是否允许发送Cookie信息config.setAllowCredentials(true);//4.允许的请求方式config.addAllowedMethod("OPTIONS");config.addAllowedMethod("HEAD");config.addAllowedMethod("GET");config.addAllowedMethod("PUT");config.addAllowedMethod("POST");config.addAllowedMethod("DELETE");config.addAllowedMethod("PATCH");//5.允许的头信息config.addAllowedHeader("*");//6.添加映射路径,我们拦截一切请求UrlBasedCorsConfigurationSource configSource = newUrlBasedCorsConfigurationSource();configSource.registerCorsConfiguration("/**", config);//7.返回新的CorsFilter.return new CorsFilter(configSource);}
}

4. 配置拦截器

如何定义SpringMVC的拦截器

SpringMVC 的拦截器主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、判断登录等功能上

第1步,定义拦截器:可以实现 HandlerInterceptor 接口来自定义拦截器,接口定义了三个方法,preHandler方法是在请求到达处理器之前执行,postHandler方法是在请求经过处理器之后、解析试图之前执行,afterCompletion方法是在视图渲染之后、返回客户端之前执行

第2步,配置拦截器:在springmvc的配置文件xml中或配置类中,配置所有拦截路径,以及需要放行的路径

SpringMVC的执行原理

  1. DispatcherServlet:请求打过来由DispatcherServlet处理,它是 SpringMVC 中的前端控制器(中央控制器), 负责接收 Request 并将 Request 转发给对应的处理组件
  2. HandlerMapping:HandlerMapping 维护了 url 和 Controller(Handler)的 映 射关系 。 DispatcherServlet 接 收 请求, 然 后 从 HandlerMapping 查找处理请求的Controller(Handler),标注了@RequestMapping 的每个 method 都可以看成是一个 Handler,HandlerMapping 在请求到达之后, 它的作用便是找到请求相应的处理器 Handler 和 Interceptors。
  3. HandlerAdapter:SpringMVC通过HandlerAdapter对Handler进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。它的作用就是按照特定的规则去执行 Controller (Handler)
  4. Handler : Controller (Handler)负责处理请求,Controller 执行后并返回 ModelAndView 对象,其中包括了数据模型和逻辑视图,ModelAndView 是封装结果 视图的组件。Handler把结果返回给HandlerAdapter,HandlerAdapter把结果返回给DispatcherServlet前端控制器。
  5. ViewResolver:DispatcherServlet收到ModelAndView,调用视图解析器(ViewResolver)来解析HandlerAdapter传递的ModelAndView。Handler执行完成后返回的是逻辑视图,也就是视图名字,一个String ,还有一个Model就是数据模型,封装成ModelAndView。ViewResolver视图解析的作用就是根据视图名,把本地模板文件(比如:xx.jsp;xx.ftl)解析为View视图对象。View用来渲染视图,也就是负责把Handler返回的数据模型model,填充到模板(jsp;ftl)形成html格式的静态内容。
  6. 最后就是把生成的html通过response写给浏览器,浏览器进行html渲染展示。

1.创建拦截器

  1. HandlerInterceptor是接口,我们可以实现该接口来定义拦截器,
  2. HandlerInterceptorAdapter是抽象类,它实现了HandlerInterceptor接口的子接口AsyncHandlerInterceptor,我们可以继承该类来定义拦截器,它简化拦截器的实现,默认preHandler返回true
/*** 登录拦截器** @author * @date */
@Component
public class LoginInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate redisTemplate;/*** 前置拦截器** @param request  请求* @param response 响应* @param handler  处理器* @return boolean* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");Boolean tag = false;if (token == null) {token = request.getParameter("token");tag = true;}Object tokenObj = redisTemplate.opsForValue().get(token);//token为null,说明没有登录,跳转到登录页面if (tokenObj == null) {responseMessage(response);if (tag) {response.sendRedirect("http://127.0.0.1/pages/login/login.html");}return false;}return true;}/*** 被拦截后的响应消息** @param response 响应* @throws IOException ioexception*/private static void responseMessage(HttpServletResponse response) throws IOException {//告诉浏览器响应数据类型response.setContentType("application/json;charset=UTF-8");//设置响应数据PrintWriter writer = response.getWriter();writer.write("{\"code\": \"403\", \"success\": false, \"msg\": \"请先登录\"}");}
}

2.添加拦截器,使用拦截器

/*** 登录拦截器配置类** @author * @date 2023/12/18*/
@Configuration
public class LoginInterceptorConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//启用登录拦截器registry.addInterceptor(loginInterceptor)//拦截所有请求.addPathPatterns("/**")//登录放行.excludePathPatterns("/login/**");}
}

5.集成Servllet组件,配置监听器

第一步:继承ServletContextListener

public interface ServletContextListener extends EventListener {//当servlet初始化上下文容器时触发public default void contextInitialized(ServletContextEvent sce) {// 获取Servlet上下文ServletContext servletContext = sce.getServletContext();// 获取springMVC上下文WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);}//当servlet销毁上下文容器时触发public default void contextDestroyed(ServletContextEvent sce) {}
}

第二步:扫描监听器

@ServletComponentScan("cn.lgc.blog.listenter")//扫描servlet监听器
public class BlogApp {public static void main(String[] args) {SpringApplication.run(BlogApp.class, args);}
}

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

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

相关文章

Wireshark学习使用记录

wireshark 是一个非常好用的抓包工具,使用 wireshark 工具抓包分析,是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境,另外一种就是应用比较多的互联网环境,也就是连接…

Windows下安装Neo4j流程

Neo4j简介 Neo4j 是一个基于图形结构的 NoSQL 数据库,专门用于存储和管理图数据。与传统的关系型数据库不同,Neo4j 使用 图(graph)的形式来表示数据,其中数据点(称为 节点)通过 边(…

分拆逆势上会,兴福电子部分专利来自母公司,独立性被拷问

作者:Cindy 来源:IPO魔女 公司拟募集资金12.10亿元,保荐机构为天风证券。兴福电子2023年5月就提交了上市申请,期间经历了2轮问询,一年多时间就开启上会。 然而值得注意的是,兴福电子属于分拆上市&#xff…

亚马逊IP关联揭秘:发生ip关联如何处理

在亚马逊这一全球领先的电商平台上,IP关联是一个不可忽视的问题,尤其是对于多账号运营的卖家而言。本文将深入解析亚马逊IP关联的含义、影响以及应对策略,帮助卖家更好地理解和应对这一问题。 什么是亚马逊IP关联? 亚马逊IP关联…

【最新华为OD机试E卷-支持在线评测】字符串变换最小字符串(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…

MySQL---创建数据库(基于SQLyog)

目录 0.前言 1.基本认识 1.1编码集 1.2检验规则 2.库的创建和销毁 2.1指令介绍 2.2你可能会出现的问题 3.查看数据库属性 4.创建指定数据库 5.创建表操作 0.前言 之前写过一篇这个关于表的创建和销毁的操作,但是当时是第一次学习,肯定有些地方…

初识 C 语言(一)

目录 一、 第一个 C 程序1. printf() 函数和 stdio.h 头文件2. main() 函数和 return 语句 二、类型和变量1. C 语言中的基本类型2. 变量的创建和命名规则3. 类型和变量的大小 三、printf() 函数和 scanf() 函数1. printf() 函数的使用2. 各种类型的输出格式3. scanf() 函数的使…

2. 网络模型、协议

网络模型、协议 一、OSI七层模型1、OSI七层作用2、数据封装、解封装 二、典型的协议1、应用层2、传输层2.1 TCP建立连接, 三次握手2.2 断开连接,四次挥手 3、网络层 一、OSI七层模型 Open System Interconnect 开放式系统互连模型 降低数据在网络中传输…

web基础—dvwa靶场(十一)CSP Bypass

CSP Bypass(CSP 绕过) 内容安全策略(CSP)用于定义脚本和其他资源可以从何处加载或执行,本模块将指导您根据开发人员犯下的常见错误来绕过该策略。 这些漏洞都不是 CSP 中的实际漏洞,它们都是实现 CSP 的方式中的漏洞。 绕过内容安…

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Linux嵌入式驱动开发指南(速记版)---Linux基础篇

第一章 Ubuntu系统入门 uname -a #查看内核版本 cat etc/issue #查看系统版本 1.1 Linux磁盘管理 1.1.1 Linux磁盘管理基本概念 关键词: Linux 磁盘管理 挂载点 /etc/fstab文件 分区 ls /dev/sd* 联系描述: Linux 磁盘管理体系通过“挂载点”概念替代…

[数据集][目标检测]手机识别检测数据集VOC+YOLO格式9997张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):9997 标注数量(xml文件个数):9997 标注数量(txt文件个数):9997 标注…

linux之mysql安装

1:mysql安装包下载 下载地址 可私信我直接获取安装包 2:linux下wget命令下载 下载地址 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz3:手动安装 将自己的安装包上传到对应的位置 解压 压缩包 使用命令 tar -zxvf mysql-5.7…

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具,软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容,流畅地…

华为静态路由(route-static)

静态路由的组成 在华为路由器中,使用ip route-static命令配置静态路由。 一条静态路由主要包含以下要素: 目的地址:数据包要到达的目标IP地址 子网掩码:用于指定目的地址的网络部分和主机部分 下一跳地址(可选&#…

中国蚁剑(antSword)安装使用

antSword下载 antSword-Loader下载 作者:程序那点事儿 日期:2024/09/12 19:35 中国蚁剑(AntSword)是一款跨平台的开源网站管理工具,旨在满足渗透测试人员的需求。它是一个功能强大的工具,可以帮助用户管理…

想学习下Python和深度学习,Python需要学习到什么程度呢?

想要学习Python和深度学习,Python的学习程度需要达到能够熟练运用这门语言进行编程,并能够理解和实现深度学习模型的基本构建和训练过程。以下是一些推荐的书籍,可以帮助你系统地学习Python和深度学习: Python学习推荐书籍 《Py…

K8S精进之路-控制器StatefulSet有状态控制 -(2)

状态说明 在进行StatefulSet部署之前,我们首先可能要了解一下,什么是"有状态应用"和"无状态应用"。无状态应用就是pod无论部署在哪里,在哪台服务器上提供服务,都是一样的结果,比如经常用的nginx。…