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