11

我正在使用 Spring MVC 并成功设置了 WebApplicationInitializer(使用 Tomcat 的 ServletContainerInitializer),没有任何 web.xml 文件。添加过滤器(如 Spring Security)和 servlet(如 Dispatcher)没有问题,而且它们工作正常。如果需要,我也可以设置 init-params。

我想不通的是如何设置一些通常存在于 web.xml 中的特殊标签。例如,我想设置一个自定义的 403 错误页面。通常我会在 web.xml 中这样做:

<error-page>
    <error-code>403</error-code>
    <location>/accessDenied.html</location>
</error-page>

但我不知道如何在 WebApplicationInitializer (它可以访问 ServletContext)中做到这一点。

我对会话超时和欢迎文件有同样的问题。我已经搜索了大约两天,但仍未看到以编程方式完成此操作。同样,目标是完全删除 web.xml 文件并改用初始化程序类。

有任何想法吗?

4

4 回答 4

7

看起来这不可能通过 WebApplicationInitializer 实现,您必须坚持使用 web.xml 来专门针对此配置以及与此问题一起列出的其他一些配置 - Using Spring MVC 3.1+ WebApplicationInitializer to programmatically configure session-config and error-page

于 2012-07-24T17:21:14.007 回答
1
StandardEngine standardEngine = (StandardEngine)MBeanServerFactory.findMBeanServer(null).get(0).getAttribute(new ObjectName("Catalina", "type", "Engine"), "managedResource");

// This is totally irresponsible and will only work if this webapp is running on the default host
StandardContext standardContext = (StandardContext)standardEngine.findChild(standardEngine.getDefaultHost()).findChild(servletContext.getContextPath());

ErrorPage errorPage404 = new ErrorPage();
errorPage404.setErrorCode(404);
errorPage404.setLocation("/404");
standardContext.addErrorPage(errorPage404);
于 2014-01-11T11:47:44.023 回答
1

你可以像这样使用一些想法:

@WebFilter(filterName = "ErrorPageFilter", urlPatterns = "/*")
public class ErrorPageFilter extends BaseHttpFilter {

private GlobalErrorHandler globalErrorHandler;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    globalErrorHandler = BeansUtil.getBean(filterConfig.getServletContext(), GlobalErrorHandler.class);
}

@Override
protected void doHttpFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, new ErrorPageHttpServletResponseWrapper(request, response));
}

private class ErrorPageHttpServletResponseWrapper extends HttpServletResponseWrapper {
    HttpServletRequest request;

    public ErrorPageHttpServletResponseWrapper(HttpServletRequest request, HttpServletResponse response) {
        super(response);
        this.request = request;
    }

    @Override
    public void sendError(int sc) throws IOException {
        globalErrorHandler.handleError(sc, request, this);
    }

    @Override
    public void sendError(int sc, String msg) throws IOException {
        sendError(sc);
    }
}
}

public interface GlobalErrorHandler {

void handleError(int responseCode, HttpServletRequest request, HttpServletResponse httpServletRequest) throws IOException;

void addHandler(int responseCode, String handlerDescription);
}
于 2016-02-25T20:10:52.923 回答
0

对于页面错误,请参阅此答案:如何制作过滤器以检测用户是否请求了未找到的页面?

  1. 制作过滤器
  2. 使用 HttpServletResponseWrapper 并覆盖 sendError() 和 setStatus()
  3. 通过 chain.doFilter(req, wrapper) 传递包装的响应
  4. 如果您在包装器中收到 sendError(),请查看它是否为 404。
  5. 采取适当的应对措施。
于 2015-12-24T08:12:21.550 回答