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

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

前言

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源码

异常状态码表示:

异常 状态码 说明
HttpRequestMethodNotSupportedException 405(Method Not Allowed) HTTP 请求方式不支持异常
HttpMediaTypeNotSupportedException 415(Unsupported Media Type) HTTP 媒体类型不支持异常
HttpMediaTypeNotAcceptableException 406(Not Acceptable) HTTP 媒体类型不可接受异常
BindException 400(Bad Request) 数据绑定异常
MissingServletRequestParameterException 400(Bad Request) 缺少参数异常
ConversionNotSupportedException 500(Internal Server Error) 数据类型转换异常
TypeMismatchException 400(Bad Request) 类型不匹配异常
HttpMessageNotReadableException 400(Bad Request) HTTP 消息不可读异常
HttpMessageNotWritableException 500(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 "";
    }
}


目录
相关文章
|
24天前
|
JSON 安全 算法
|
4月前
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
4月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
25 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
3月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
51 0
|
3月前
|
Java API 开发者
【开发者福音】Spring Boot 异常处理:优雅应对错误,提升应用健壮性,让调试不再是噩梦!
【8月更文挑战第29天】本文通过对比传统错误处理方式与Spring Boot推荐的最佳实践,展示了如何在Spring Boot应用中实现统一且优雅的异常处理。传统方法需在每个可能出错的地方显式处理异常,导致代码冗余且不一致。而Spring Boot的全局异常处理机制则能集中处理所有异常,简化代码并确保错误响应格式统一,提高应用程序的健壮性和可维护性。文中提供了具体的示例代码以帮助读者更好地理解和应用这一机制。
107 0
|
3月前
|
前端开发 JavaScript Java
Spring Boot中使用拦截器
本节主要介绍了 Spring Boot 中拦截器的使用,从拦截器的创建、配置,到拦截器对静态资源的影响,都做了详细的分析。Spring Boot 2.0 之后拦截器的配置支持两种方式,可以根据实际情况选择不同的配置方式。最后结合实际中的使用,举了两个常用的场景,希望读者能够认真消化,掌握拦截器的使用。
|
4月前
|
JSON Java 数据库
Spring Boot中的全局异常处理
主要讲解了Spring Boot 的全局异常处理,包括异常信息的封装、异常信息的捕获和处理,以及在实际项目中,我们用到的自定义异常枚举类和业务异常的捕获与处理,在项目中运用的非常广泛,基本上每个项目中都需要做全局异常处理。
|
4月前
|
Java 数据库连接 测试技术
在Spring Boot中实现数据校验与验证
在Spring Boot中实现数据校验与验证
|
4月前
|
监控 前端开发 Java
Spring Boot中的拦截器配置
Spring Boot中的拦截器配置