在spring过滤器中设置视图名称

cod*_*247 9 java spring jsp tiles servlet-filters

我有一个ErrorFilter延伸弹簧GenericFilterBean.如果发生某些错误,我想显示一个用tile装饰的错误页面.

有没有办法从过滤器设置视图名称?

<filter>
    <filter-name>errorFilter</filter-name>
    <filter-class>com.abc.filter.ErrorFilter</filter-class>
    <init-param>
        <param-name>errorPage</param-name>
        <param-value>/jsp/errorpage.jsp</param-value>
    </init-param>
</filter>
Run Code Online (Sandbox Code Playgroud)

这是在配置web.xmldoFilter方法在errorfilter如下:

public void doFilter(ServletRequest req, ServletResponse resp,
        FilterChain chain) throws IOException, ServletException {

    HttpServletRequest httpReq = (HttpServletRequest) req;
    StringBuffer reqUrl = httpReq.getRequestURL();
    try {
        chain.doFilter(req, resp);
    } catch (Exception ex) {
        String requestRepresentation = createRequestRepresentation(req);
        errorService.handleException(reqUrl.toString(), ex, requestRepresentation);
        req.getRequestDispatcher(
                getFilterConfig().getInitParameter("errorPage")).forward(req, resp);
    } catch (Error er) {
        errorService.handleError(reqUrl.toString(), er);
        req.getRequestDispatcher(
                getFilterConfig().getInitParameter("errorPage")).forward(req, resp);
    }
}
Run Code Online (Sandbox Code Playgroud)

当前的错误不是用瓷砖装饰的,所以我想用普通的页眉和页脚来装饰它,从过滤器中调用该视图名称.

可能吗 ?

编辑: 基本上我们希望能够做类似于Controller-method的事情,即返回"视图名称";

已经尝试过:

  • httpResponse.sendRedirect( "errorPageView"); 不起作用,它重定向到http:// server/fooerrorPageView
  • request.getRequestDispatcher("errorPageView").forward(request,response); 也没有,类似于上面(没有http重定向,但给出相同的"没有这样的页面错误"内容)

Igo*_*hin 0

必须有一种方法可以用 Spring MVC 来做到这一点,但我认为重定向就足够了。

try {
    chain.doFilter(req, resp);
} catch (Exception ex) {
    if (response.isCommitted()) {
        log(ex); // at least a part of the response is already sent to the client, you can't do much about it
    } else {
        session.setAttribute("last.exception", ex);
        response.sendRedirect(request.getContextPath() + getFilterConfig().getInitParameter("errorPage"));
    }
}
Run Code Online (Sandbox Code Playgroud)

PS 不要捕获错误!