簡體   English   中英

使用過濾器捕獲404(以及其他服務器錯誤?)

[英]Catching 404s (and other server errors?) using Filter

我不確定是否已經在這里問過這個問題,我能找到的最好的重復項是Servlet過濾器url映射/ *無法處理404錯誤

但這不能解決我的問題。

我正在使用Jetty 9,並且有一個類似這樣的過濾器-

@WebFilter(dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.ERROR }, urlPatterns = { "/*" })
public class ErrorHandler implements Filter {

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        int errorcode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
        String message = "";
        boolean error = false;

        StringWriter sw_stacktrace = new StringWriter();
        PrintWriter pw_stacktrace = new PrintWriter(sw_stacktrace);

        try {
            chain.doFilter(request, response);
        } catch (AppException e) {
            errorcode = e.getCode();
            error = true;
            message = e.getMessage();
            e.printStackTrace(pw_stacktrace);
        } catch (Throwable t) {
            error = true;
            message = "Unknown Error";
            t.printStackTrace(pw_stacktrace);
        }

        if (!response.isCommitted()) {
            if (error) {
                if (errorcode == HttpServletResponse.SC_INTERNAL_SERVER_ERROR) {
                    String log = String.format("Error %d Occurred - \n %s \n Stack Trace - \n %s", errorcode, message, sw_stacktrace.toString());
                    request.getServletContext().log(log);
                }

                HttpServletResponse resp = (HttpServletResponse) response;
                resp.setStatus(errorcode);
                request.setAttribute("errorMessage", message);
            } else {
                request.setAttribute("errorMessage", request.getAttribute("javax.servlet.error.message"));
            }
            request.getRequestDispatcher("/WEB-INF/templates/error/" + errorcode + ".jsp").forward(request, response);          
        }
        pw_stacktrace.close();
    }

    public void init(FilterConfig fConfig) throws ServletException {

    }
}

我正在使用它來捕獲自定義異常類型( ServletException子類)和運行時發生的任何其他異常(空指針等)以顯示錯誤頁面-效果很好。

但是由於某種原因,我的過濾器沒有被404調用。 正如我鏈接的問題中所述,我也嘗試過web.xml方法,但這也不起作用。

我是Java和所有這些東西的新手。.我可能在這里嘗試了錯誤的事情,但是如果過濾器不應該捕獲所有類型的錯誤,那么DispatcherType.ERROR的用途到底是什么? 我知道可以按照http://www.eclipse.org/jetty/documentation/current/custom-error-pages.html所述配置自定義錯誤頁面

只是對這個東西感到好奇。

所以,事實是404並不是真正的例外。 當我在web.xml設置<error-page>時,將調用標記有DispatcherType.ERROR過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM