在我目前的spring-boot项目中,我有这个ExceptionHandler:
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception error) throws Exception {
if (AnnotationUtils.findAnnotation(error.getClass(), ResponseStatus.class) != null)
throw error;
ModelAndView mav = new ModelAndView();
mav.setAttribute("error", error);
return mav;
}
}
我想要做的是让这个处理程序重定向到不同的错误页面,这取决于错误的来源。
我有两种类型"我的项目中的页面:由匿名用户或经过身份验证的用户访问的公共页面,以及仅由经过身份验证的用户访问的管理页面(私有)。
这两种类型的页面有不同的风格。我想,当用户在公共页面中发生错误时,会显示带有公共样式的错误页面。如果用户在私有页面中时发生错误,则会显示另一个错误页面,其中显示私有页面的样式。
答案 0 :(得分:0)
您可以构建一个选择它需要在控制器中抛出的异常类,假设如下:
Address
假设这是@RequestMapping(value = "/check")
public ModelAndView processUser( ) throws Exception {
ModelAndView modelAndView = new ModelAndView();
if (something... ) {
throw new GlobalDefaultExceptionHandler( ); // throws GlobalDefaultExceptionHandler
}
if (something else... ) {
throw new AnotherExceptionHandler( );// throws 'anotherExceptionHandler'
}
// If there isn't exception thrown....do something
}
类:
AnotherExceptionHandler
但是如果你被迫只使用一个处理程序,你可以直接使用选择:
@ControllerAdvice
public class AnotherExceptionHandler{
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception error) throws Exception {
if (AnnotationUtils.findAnnotation(error.getClass(), ResponseStatus.class) != null)
throw error;
// Go to another view
ModelAndView mav = new ModelAndView();
mav.setAttribute("anotherError", error);
return mav;
}
}
答案 1 :(得分:0)
有几种选择。其中一些是:
您可以使用request.getUserPrincipal()
检查用户是否已通过身份验证。如果用户未经过身份验证,则返回值为null
。根据结果,您可以返回不同的视图。
让所有Contoller服务公共页面从一个PublicBaseController扩展,控制器服务专用页面扩展PrivateBaseController。将带有@ExceptionHandler
注释的方法添加到基本控制器,这些控制器返回适当的视图。