前言
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 ""; } }