11

私はSpringMVCを使用しており、web.xmlファイルなしで(TomcatのServletContainerInitializerを使用して)WebApplicationInitializerを正常にセットアップしました。フィルタ(Spring Securityなど)とサーブレット(Dispatcherなど)を追加しても問題はなく、正常に機能します。必要に応じて、init-paramsを設定することもできます。

私が理解できないのは、web.xmlに通常存在するいくつかの特別なタグを設定する方法です。たとえば、カスタム403エラーページを設定したいと思います。通常、これはweb.xmlで次のように行います。

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

しかし、WebApplicationInitializer(ServletContextにアクセスできる)内でこれを行う方法を理解できません。

session-timeoutとwelcome-filesでも同じ問題があります。私は約2日間検索してきましたが、プログラムでこれが行われるのを見ていません。ここでも、web.xmlファイルを完全に削除し、代わりに初期化子クラスを使用することが目標です。

何か案は?

4

4 に答える 4

7

これはWebApplicationInitializerで可能ではないようです。具体的には、この質問にリストされている他のいくつかの構成とともに、web.xmlに固執する必要があります-Spring MVC3.1+WebApplicationInitializerを使用してプログラムでsession-configとエラーページを構成します

于 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 に答える