《Spring MVC》 第八章 拦截器实现权限验证、异常处理

news2024/9/20 1:11:38

前言

Spring 提供了Interceptor 拦截器,可用于实现权限验证、异常处理等

1、拦截器

对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作

1.1、定义拦截器

/**
 * 拦截器
 */
public class MvcInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
方法名返回值说明
preHandle ()boolean该方法在控制器方法之前执行,其返回值用来表示是否中断后续操作。返回值为 true 时,表示继续向下执行;返回值为 false 时,表示中断后续的操作。
postHandle ()void该方法会在控制器方法调用之后,解析视图之前执行。我们可以通过此方法对请求域中的模型(Model)数据和视图做出进一步的修改。
afterCompletion ()void该方法会在整个请求完成后,即视图渲染结束之后执行。我们可以通过该方法实现资源清理、日志记录等工作。

1.2、配置拦截器

<!-- 配置拦截器-->
 <mvc:interceptors>
     <mvc:interceptor>
         <!--拦截的路径/dskfsd/sdfsdf/sdfsdf/asdfa-->
         <mvc:mapping path="/**"/>
         <!--不需要拦截的路径-->
         <mvc:exclude-mapping path="/login"/>
         <mvc:exclude-mapping path="/"/>
         <bean class="com.hqyj.springmvc.interceptor.MvcInterceptor"/>
     </mvc:interceptor>
 </mvc:interceptors>

1.3、拦截器执行流程在这里插入图片描述

在这里插入图片描述

2、异常处理

Spring MVC 提供了一个名为 HandlerExceptionResolver 的异常处理器接口,常用的实现类如下:

  • DefaultHandlerExceptionResolver
  • ResponseStatusExceptionResolver
  • ExceptionHandlerExceptionResolver
  • SimpleMappingExceptionResolver

ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver 和 DefaultHandlerExceptionResolver 是 Spring MVC 的默认异常处理器。Spring MVC 会按照 ExceptionHandlerExceptionResolver → ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver 的顺序,依次使用这三个异常处理器对异常进行解析

2.1、ExceptionHandlerExceptionResolver源码

异常状态码表示:

异常状态码说明
HttpRequestMethodNotSupportedException405(Method Not Allowed)HTTP 请求方式不支持异常
HttpMediaTypeNotSupportedException415(Unsupported Media Type)HTTP 媒体类型不支持异常
HttpMediaTypeNotAcceptableException406(Not Acceptable)HTTP 媒体类型不可接受异常
BindException400(Bad Request)数据绑定异常
MissingServletRequestParameterException400(Bad Request)缺少参数异常
ConversionNotSupportedException500(Internal Server Error)数据类型转换异常
TypeMismatchException400(Bad Request)类型不匹配异常
HttpMessageNotReadableException400(Bad Request)HTTP 消息不可读异常
HttpMessageNotWritableException500(Internal Server Error)HTTP 消息不可写异常

2.2、ResponseStatusExceptionResolver

用来解析 @ResponseStatus 注解标注的自定义异常,并把异常的状态信息返回给客户端展示。

package com.hqyj.springmvc.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(code= HttpStatus.BAD_REQUEST,reason = "hello自定义异常")
public class HelloException extends RuntimeException{
}

定义controller方法,然后抛出以上的异常。

2.3、ExceptionHandlerExceptionResolver

ExceptionHandlerExceptionResolver 可以在控制器方法出现异常时,调用相应的 @ExceptionHandler 方法对异常进行处理。

@ExceptionHandler(Exception.class)
public String handleException(Exception e){
    e.printStackTrace();
    return "exception";
}

定义多个exception处理类优先顺序问题

2.4、全局异常处理

/**
 * 全局异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public String exceptionAdvice(Exception e){
        e.printStackTrace();
        return "";
    }
}

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

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

相关文章

UGUI中点击判断的原理

首选需要理解 EventSystem 中的代码结构&#xff0c;EventSystem 目录下包含4个子文件夹&#xff0c;分别是 EventData、InputModules&#xff0c;Raycasters 和 UIElements&#xff0c;UIElements 下是 UI Toolkit 相关代码&#xff0c;这里不做研究&#xff0c;主要关注其他三…

linux文件及文件内容查找命令总结

在linux环境下&#xff0c;我们经常要查找一个文件或者文件的内容&#xff0c;但搜索的命令有很多&#xff0c;这些命令都有什么区别&#xff0c;应该怎么选择和使用呢&#xff1f; 下面总结了一些常见的文件查找、内容查找的命令&#xff0c;收藏起来备用吧。 文件查找 where…

每日学术速递4.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Long-Term Photometric Consistent Novel View Synthesis with Diffusion Models 标题&#xff1a;具有扩散模型的长期光度一致的新视图合成 作者&#xff1a;Jason J. Yu, Feresh…

Python入门教程+项目实战-11.3节: 元组的操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 知识要点 11.3.4 系统学习python 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;着重介绍元组类型的操作方法…

hive udf, tried to access method org.bouncycastle.math.ec.ECPoint$AbstractFp

在hive中添加加密udf,测试报错&#xff1a; select encrypt_sm2("aa","04AD9356466C7A505B3B2E18F2484E1F096108FA19C0F61C707A808EDF7C132BC3CE33E63D2CC6D77FB0A172004F8F5282CEADE22ED9628A02FE8FD85AF1EFE8B3"); Error: Error while compiling statem…

从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档

VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的。本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 site 文件夹,并执行pnpm init,然后安装vitepress和vue pnpm install -D vitepress vue安…

什么是分库分表?为什么需要分表?什么时候分库分表

不急于上手实战 ShardingSphere 框架&#xff0c;先来复习下分库分表的基础概念&#xff0c;技术名词大多晦涩难懂&#xff0c;不要死记硬背理解最重要&#xff0c;当你捅破那层窗户纸&#xff0c;发现其实它也就那么回事。 什么是分库分表 分库分表是在海量数据下&#xff0…

“星河杯”隐私计算大赛新闻发布会在京召开

4月24日下午&#xff0c;“星河杯”隐私计算大赛新闻发布会在京召开。本次大赛由中国信通院、中国通信学会、隐私计算联盟共同主办&#xff0c;中移动信息技术有限公司、联通数字科技有限公司、天翼电子商务有限公司、中国通信标准化协会大数据技术标准推进委员会联合协办&…

微信小程序 | 基于高德地图+ChatGPT实现旅游规划小程序

&#x1f388;&#x1f388;效果预览&#x1f388;&#x1f388; ❤ 路劲规划 ❤ 功能总览 ❤ ChatGPT交互 一、需求背景 五一假期即即将到来&#xff0c;在大家都阳过之后&#xff0c;截止到目前这应该是最安全的一个假期。所以出去旅游想必是大多数人的选择。 然后&#x…

Activity中startForResult的原理分析

前言&#xff1a; 如果使用androidX支持库中的ComponentActivity&#xff0c;会推荐使用registerForActivityResult的方式。但是对于不支持androidX的项目&#xff0c;或者就是继承自Activity的页面来说&#xff0c;startActivityForResult仍然是唯一的选择。 如果想了解andr…

虹科教您 | 虹科RELY-TSN-KIT操作指南(3)——基于Linux系统进行TSN协议测试

随着技术的变革和实际生产业务需求的推动&#xff0c;工厂内部互联架构逐渐趋于扁平化&#xff08;IT/OT融合&#xff09;&#xff0c;而TSN则是在这一背景下发展起来的新兴技术&#xff0c;旨在为以太网协议建立“通用”的时间敏感机制&#xff0c;以确保网络数据传输的时间确…

云计算服务安全评估办法

云计算服务安全评估办法 2019-07-22 14:46 来源&#xff1a; 网信办网站【字体&#xff1a;大 中 小】打印 国家互联网信息办公室 国家发展和改革委员会 工业和信息化部 财政部关于发布《云计算服务安全评估办法》的公告 2019年 第2号 为提高党政机关、关键信息基础设施运营者…

鸿蒙系统是什么?鸿蒙与开源鸿蒙的关系?鸿蒙系统的发展历程

鸿蒙OS分布式操作系统简介鸿蒙系统&#xff08;HarmonyOS)&#xff0c;是第一款基于微内核的全场景分布式OS&#xff0c;是华为自主研发的操作系统。现被华为捐献给开放原子基金会管理&#xff0c;为开放原子基金会下的一个项目。 从 系统定位 上来说&#xff0c;HarmonyOS是一…

explain都不懂?搞什么数据库优化,快进来学习了

文章目录 一、 前言二、MySQL EXPLAIN实战三、mysql EXPLAIN输出结果详解3.1 id详解3.2 select_type3.3 table3.4 partitions3.5 type3.6 possible_keys3.7key3.8 key_len3.9 ref3.10 rows3.11 filtered3.12 Extra 一、 前言 EXPLAIN 想必用过mysql的小伙伴都听过&#xff0c;…

PWM 呼吸灯实验

PWM 呼吸灯实验 FPGA实现一个PWM模块&#xff08;硬件&#xff09;来控制灯的亮灭。 实验原理 PWM本质上就是一个输出脉冲的硬件&#xff0c;通过改变一个周期高电平&#xff08;占空比&#xff09;的时间来对其他的硬件进行控制&#xff0c;比如电机。 呼吸灯的实现利用了人…

谈谈如何用开源网关进行 API 管理

需求痛点 1.企业不清楚到底有多少个API&#xff0c;无法形成API资产管理等问题。 2.API在不同集群的生命周期问题。 3.API运行状态监控和告警问题。 4.API请求限流、流量控制以及安全等问题。 功能介绍 Apinto的API管理提供API生命周期控制&#xff1a;可管理所有API&…

Cortex-R52 GIC:Generic Interrupt Controller(一)

ARM Cortex-R52 GIC:Generic Interrupt Controller 1.关于GIC 1.1 GIC Overview ARM的中断控制器被称为GIC(Generic Interrupt Controller)&#xff0c;GIC是支持和管理系统中断的资源的模块。它支持中断优先级、中断路由到CPU或输出端口、中断抢占和中断虚拟化等功能。 中断…

深入浅出Rust核心概念:生命周期

简介 Rust是一种快速、安全、并发的系统级编程语言&#xff0c;它的设计目标是提供一种高效、内存安全的编程方式。而生命周期&#xff08;Lifetime&#xff09;是Rust语言中的一个核心概念&#xff0c;它与内存管理、函数传参和引用操作等方面密切相关。LZ将详细介绍Rust中生…

GitHub 开启 2FA 双重身份验证的方法

为什么要开启 2FA 自2023年3月13日起&#xff0c;我们登录 GitHub 都会看到一个要求 Enable 2FA 的重要提示&#xff0c;具体如下&#xff1a; GitHub users are now required to enable two-factor authentication as an additional security measure. Your activity on Git…

Matplotlib 轴标签和标题

我们可以使用 xlabel() 和 ylabel() 方法来设置 x 轴和 y 轴的标签。 实例 import numpy as np import matplotlib.pyplot as pltx np.array([1, 2, 3, 4]) y np.array([1, 4, 9, 16]) plt.plot(x, y)plt.xlabel("x - label") plt.ylabel("y - label")…