完成JSP异常上的视图呈现后重定向

时间:2013-11-26 09:13:17

标签: jsp spring-mvc interceptor

我正在尝试处理JSP视图抛出的异常。由于Spring MVC无法直接处理这些异常,因为它们被抛出控制器的范围,我试图通过HandlerInterceptorAdapter处理它们。

afterCompletion方法使我可以访问从JSP抛出的异常,因此我可以使用唯一的错误ID记录异常。但另外我想向客户显示一个用户友好的错误页面。所以我的第一个想法是将用户重定向到我现有的错误页面,该页面显示唯一的错误ID。

但似乎忽略了重定向。是否可以在此方法中进行重定向?或者是否可以更改响应,因为它已经呈现?

这是我的第一次尝试:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import de.lwv.mass2.client.web.controller.BasicExceptionHandlerController;

@Component
public class JspExceptionHandler extends HandlerInterceptorAdapter {

    private static Logger LOGGER = LoggerFactory.getLogger(JspExceptionHandler.class);

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

        if (ex != null) {
            final String uuid = BasicExceptionHandlerController.generateExceptionUUID();

            LOGGER.error("Exception: " + uuid, ex);
            // redirect
            response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            response.sendRedirect(request.getContextPath() + "/error?id=" + uuid);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我认为在调用afterCompletion时已经提交了响应(以及呈现的视图)。

作为替代建议,您可以向error-page添加web.xml,它将充当“全部捕获”处理程序 - 捕获源自JSP视图的异常和无法处理的其他异常由HanlderInterceptorAdapter

例如,在您的web.xml中,您可以添加:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/error</location>
</error-page>

您还可以通过错误代码定义这些:

<error-page>
    <error-code>500</error-code>
    <location>/error</location>
</error-page>

<location>可以是另一个控制器,一个静态HTML页面或一个JSP视图 - 如下所示。

<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/jsp/500.jsp</location>
</error-page>