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)的形式来表示数据,其中数据点(称为 节点)通过 边(…

检测死锁的机制

PostgreSQL(PG)检测死锁的机制主要基于等待图(WFG, wait-for graph)和超时设置。以下是详细的死锁检测过程: 等待图构建:当一个事务在尝试获取资源时,如果未能立即获得所需的锁,并且…

使用lodash库实现防抖和节流

在 JavaScript 中,lodash 是一个非常流行的实用工具库,提供了许多常用的函数,其中就包括防抖和节流的实现。lodash 提供的 debounce 和 throttle 函数可以让我们更方便地实现这两种功能。 1. 使用 lodash 的 debounce(防抖&#…

【6】AT32F437 OpenHarmony轻量系统移植教程(3)

开源地址:https://gitee.com/AT32437_OpenHarmony 学习本文档的意义 1.学习移植OpenHarmony轻量系统到AT32全系列mcu上,本文档移植的具体型号为AT32F437ZMT7 2.学习OpenHarmony轻量系统开发 6.target_config.h文件适配 在//kernel/liteos_m/kernel/…

秋招喜来,分享一份最新的面经

💼岗位职责: 负责后端服务的开发与维护;技术预研和技术难点攻关,保障系统可用性、稳定性、和可扩展性;持续优化系统架构设计,提出问题解决方案。 📋任职要求: 计算机或相关专业&a…

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

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

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

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

Java高级Day51-apacheDBUtils

136.ApDBUtils 基本介绍 commons-dbutils 是 Apache 组织提供的一个开源JDBC工具类库,它是对JJDBC的封装,使用dbutils能极大简化jdbc编码的工作量 QueryRunner类:该类封装了SQL的执行,是线程安全的。可以实现增删改查和批处理 …

【最新华为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…

map的使用

pair类型介绍 map底层的红⿊树节点中的数据&#xff0c;使⽤pair<Key, T>存储键值对数据 typedef pair<const Key, T> value_type; template <class T1, class T2> struct pair {typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : …

Unity的Text组件中实现输入内容的渐变色效果

要在Unity的Text组件中实现输入内容的渐变色效果&#xff0c;默认的Text组件不直接支持渐变色。但是&#xff0c;你可以通过以下几种方式实现&#xff1a; ### 1. **使用Shader**来实现渐变效果 通过自定义Shader为Text组件创建一个渐变效果。这是一个常用的做法&#xff0…

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

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

初识 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建立连接&#xff0c; 三次握手2.2 断开连接&#xff0c;四次挥手 3、网络层 一、OSI七层模型 Open System Interconnect 开放式系统互连模型 降低数据在网络中传输…

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

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

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

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

Eigen之SelfAdjointEigenSolver

Eigen::SelfAdjointEigenSolver 是 Eigen 库中的一个类,用于计算自伴随矩阵(对称矩阵)的特征值和特征向量。自伴随矩阵是指其等于自身的共轭转置的矩阵,通常在物理和工程中出现,比如协方差矩阵、赫尔米特矩阵等。 常用用法: 计算特征值和特征向量: SelfAdjointEigenSol…

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

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