spring学习(6)
【摘要】 常用 AOP异常处理@ControllerAdvice / @RestControllerAdvice: 标注当前类为所有 Controller 类服务@ExceptionHandler: 标注当前方法处理异常(默认处理 RuntimeException) @ExceptionHandler(value = Exception.class): 处理所有异常@RestControllerAdv...
常用 AOP
异常处理
-
@ControllerAdvice
/@RestControllerAdvice
: 标注当前类为所有 Controller 类服务 -
@ExceptionHandler
: 标注当前方法处理异常(默认处理 RuntimeException)@ExceptionHandler(value = Exception.class)
: 处理所有异常
@RestControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(Throwable.class)
public ResultBean handleOtherException(Throwable e) {
String message = String.format("错误=%s,位置=%s", e.toString(), e.getStackTrace()[0].toString());
return ResultBean.error(ErrorCode.UNKNOWN_ERROR.getErrorCode(), message);
}
@ExceptionHandler(StreamPlatformException.class)
public ResultBean handleVenusException(StreamPlatformException e) {
return ResultBean.error(e.getErrorCode(), e.getMessageToUser());
}
@ExceptionHandler(FormValidationException.class)
public ResultBean handleFormValidationException(FormValidationException e) {
StringBuilder message = new StringBuilder();
e.getResult().getAllErrors().forEach(objectError -> {
if (objectError instanceof FieldError) {
FieldError fieldError = (FieldError) objectError;
message.append("参数").append(fieldError.getField())
.append("错误值为").append(fieldError.getRejectedValue())
.append(fieldError.getDefaultMessage());
} else {
message.append(objectError.getDefaultMessage());
}
});
return ResultBean.error(ErrorCode.PARAMETER_VALIDATION_ERROR.getErrorCode(),
String.format(ErrorCode.PARAMETER_VALIDATION_ERROR.getMessage(), message));
}
}Copy to clipboardErrorCopied
拦截器
- 拦截器(Interceptor)
Java Web 中,在执行 Controller 方法前后对 Controller 请求进行拦截和处理。依赖于 web 框架,在 Spring 配置。在实现上基于 Java 的反射机制。
- 过滤器(Filter)
Java Web 中,在 request/response 传入 Servlet 前,过滤信息或设置参数。依赖于 servlet 容器,在 web.xml 配置。在实现上基于函数回调。
两者常用于修改字符编码、删除无用参数、登录校验等。Spring 框架中优先使用拦截器:功能接近、使用更加灵活。
拦截器配置
// 在配置中引入拦截器对象(单独编写拦截器类)
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 导入拦截器对象,默认拦截全部
InterceptorRegistration addInterceptor = registry.addInterceptor(new myInterceptor());
// 排除配置
addInterceptor.excludePathPatterns("/error","/login","/user/login");
addInterceptor.excludePathPatterns("/asserts/**");
addInterceptor.excludePathPatterns("/webjars/**");
addInterceptor.excludePathPatterns("/public/**");
// 拦截配置
addInterceptor.addPathPatterns("/**");
}Copy to clipboardErrorCopied
拦截器类通过实现 HandlerInterceptor 接口或者继承 HandlerInterceptorAdapter 类。
// 定义拦截器
public class myInterceptor extends HandlerInterceptorAdapter {
// Session key
public final static String SESSION_KEY = "user";
// preHandle 预处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 检查 session
HttpSession session = request.getSession();
if (session.getAttribute(SESSION_KEY) != null) return true;
// 重定向到登录页面
request.setAttribute("message","登录失败,请先输入用户名和密码。");
request.getRequestDispatcher("login").forward(request,response);
return false;
}
// postHandle 善后处理
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) {
System.out.println("INTERCEPTOR POSTHANDLE CALLED");
}
}Copy to clipboardErrorCopied
过滤器类通过继承 Filter 类实现,直接添加注解即可。
@Component // 作为组件,交给容器处理
@ServletComponentScan // 扫描组件
@WebFilter(urlPatterns = "/login/*",filterName = "loginFilter") // 设定过滤路径和名称
@Order(1) // 设定优先级(值小会优先执行)
public class LoginFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 过滤器前执行
System.out.println("before");
// 执行内部逻辑
filterChain.doFilter(servletRequest,servletResponse);
// 过滤器后执行
System.out.println("after");
}
@Override
public void destroy() {
}
}Copy to clipboardErrorCopied
调用顺序
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)