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

文章详细介绍了SpringMVC中的拦截器机制,包括定义拦截器、配置拦截器及其执行流程。同时,文章探讨了SpringMVC的异常处理,如ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver的使用,以及如何实现全局异常处理。
摘要由CSDN通过智能技术生成

系列文章目录

第一章 MVC模式
第二章 让程序run起来
第三章 @Controller、@RequestMapping 注解和获取请求参数
第四章 域对象、视图、转发和重定向
第五章 第五章 实现RESTful
第六章 MVC类型转换器、格式化器
第七章 JSON数据交互
第八章 拦截器实现权限验证、异常处理
第九章 文件上传、下载
第十章 使用logback+Slf4j打印日志
第十一章 单体架构任务调度



在这里插入图片描述


前言

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 "";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青花科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值