Spring MVC在发生404错误时使用AOP

时间:2015-01-04 13:34:45

标签: spring-mvc http-status-code-404 aop

现在我有一个方面:

@Around(value = "execution(* package.controller.*.*View(..)) && args(.., request)")
public ModelAndView getUserProfile(ProceedingJoinPoint proceedingJoinPoint, HttpServletRequest request) throws Throwable {
    ModelAndView view = null;
    view = (ModelAndView) proceedingJoinPoint.proceed();

    HttpSession session = request.getSession();
    boolean isLoggedIn = isLoggedIn(session);
    if ( isLoggedIn ) {
        User user = (User)session.getAttribute("user");
        view.addObject("isLogin", isLoggedIn)
            .addObject("profile", user);
    }
    return view;
}

如您所见,一旦调用* View方法,此方面将向ModelAndView对象添加会话信息。

但是,当发生HTTP 404错误时,此方面无法正常工作。 但是如何在404错误页面上向ModelAndView对象添加额外信息?

我为404错误创建了自己的错误页面:

<error-page>
    <error-code>404</error-code>
    <location>/WEB-INF/views/errors/404.jsp</location>
</error-page>

非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以在控制器中使用@ExceptionHandler来处理错误并向ModelAndView添加额外信息。只要出现错误,就会调用此方法,并允许您修改响应。

查看位于http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

的Spring文档

这是一个来自Spring博客的好例子: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

  @ExceptionHandler(Exception.class)
  public ModelAndView handleError(HttpServletRequest req, Exception exception) {
    logger.error("Request: " + req.getRequestURL() + " raised " + exception);

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", exception);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
  }