Servlet Ajax глобальная обработка исключений - PullRequest
3 голосов
/ 10 ноября 2011

У меня есть глобальный обработчик для моих вызовов AJAX

$.ajaxSetup({
    error: function(xhr, textStatus, errorThrown) {
             //do something 
    }
});

И в случае ошибки мой сервлет-фильтр отправляет конкретную ошибку

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException {

    if(somethingwrong()) {
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "unavailableimage");    
    }
}

Вы бы порекомендовали сделать что-то вроде

$.ajaxError({
    error: function(xhr, textStatus, errorThrown) {
        if (xhr.status == 408) {
            //doSomething
        }
        else if xhr.responseText.contains("unavailableimage"){
            //doSomething
        }
    }
}); 

Потому что я думаю, что текст ответа различен в каждом браузере.

Ответы [ 2 ]

7 голосов
/ 10 ноября 2011

Тело ответа доступно по xhr.responseText.

Однако HttpServletResponse#sendError() (<- нажмите ссылку, чтобы прочитать Javadoc самостоятельно) будет использовать шаблон страницы ошибок по умолчанию для сервлет-контейнера или ваш пользовательский шаблон страницы ошибок, как вы определилив <code>web.xml.Это HTML-документ, который вы должны проанализировать сами.

Согласно вашему комментарию к другому ответу, вы, кажется, используете Tomcat и извлекаете страницу ошибки по умолчанию;сообщение доступно как первый <u> элемент второго <p>.Так что это должно сделать:

var errorMessage = $(xhr.responseText).filter('p:eq(1)').find('u').text();

if (errorMessage == 'unavailableimage') {
    // ...
}

Вам нужно только помнить, что вы так тесно связаны с разметкой страницы ошибок (по умолчанию).Лучше не использовать HttpServletResponse#sendError(), а просто установить статус с помощью HttpServletResponse#setStatus() (<- да, нажмите на него, чтобы прочитать Javadoc, ответ был там) и написать сообщение об ошибке в ответтело себя: </p>

response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.getWriter().write("unavailableimage");

Таким образом, xhr.responseText в точности unavailableimage.

if (xhr.responseText == 'unavailableimage') {
    // ...
}
1 голос
/ 10 ноября 2011

В своих проектах я использую эту функцию для отладки ajax:

$.ajaxSetup({
        error:function(x,e){
            if(x.status==0){
                alert('You are offline!!\n Please Check Your Network.');
            }else if(x.status==404){
                alert('Requested URL not found.');
            }else if(x.status==500){
                alert('Internal Server Error.\n'+x.responseText););
            }else if(e=='parsererror'){
                alert('Error.\nParsing JSON Request failed.');
            }else if(e=='timeout'){
                alert('Request Time out.');
            }else {
                alert('Unknow Error.\n'+x.responseText);
            }
        }
    });

, поэтому с помощью своего кода вы можете проверить, содержит ли x.responseText «unavailableimage», но проверить его по коду ошибкии сообщение об ошибке лучше;)

Другой способ получить только ответное сообщение об ошибке - использовать: var responseText = $.httpData(xhr) в зависимости от вашей версии JQuery (<1.5.2) </p>

или с помощью json: var responseText = $.parseJSON(x.responseText);

...