Как распознать код ошибки http из GWT? - PullRequest
2 голосов
/ 10 февраля 2011

Когда мои пользователи пытаются выполнить действие на нашем веб-сайте после истечения срока их сеанса (например, если они оставили свой браузер открытым), сервер отвечает HTTP Status 405, потому что пользователь больше не вошел в систему.

Когда это происходит, я хочу перенаправить пользователя на экран входа в систему.

Как узнать, когда в GWT возвращается код ошибки 405, чтобы я мог перенаправить пользователей?

Спасибо

Edit: Вот фильтр, который я использую:

public class AuthenticationFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        if (req instanceof HttpServletRequest) {
            boolean isLoggedIn = CustomSecurity.login((HttpServletRequest)req);
            if (isLoggedIn) {
                // TODO: How to redirect the user here???
                }
        }
        chain.doFilter(req, res);
    }

    public void init(FilterConfig arg0) throws ServletException {
    }
}

web.xml content:

<filter>
    <filter-name>Authentication Filter</filter-name>
    <filter-class>com.company.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Authentication Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Как я могу сделать это перенаправить пользователя? Кроме того, есть ли способ заставить весь браузер перенаправить? Поскольку это входит в виджет, я думаю, что Window.Location.assign ('url') будет перенаправлять только содержимое HTML виджета.

Ответы [ 4 ]

3 голосов
/ 10 февраля 2011

В настоящее время я работаю над приложением GWT, которое делает что-то очень похожее на то, что вы просите.Однако мы обрабатываем эти перенаправления в стандартном подклассе javax.servlet.Filter, который мы определяем в нашем web.xml как обычно, и он сопоставляется с / *, поэтому он перехватывает все запросы (мы также используем этот фильтр по многим другим причинам).

Я не знаю, используете ли вы также Фильтр или, возможно, какой-нибудь универсальный сервлет в своем приложении GWT, но если вы это делаете, то решение вашей проблемы довольно простое.У вас будет дескриптор HttpServletRequest, и вы сможете увидеть, возвращает ли метод getSession (false) значение null, тогда вы знаете, что у пользователя, отправившего запрос, больше нет сеанса.Затем вы можете просто сделать стандартный response.sendRedirect (...) на свою страницу входа.

2 голосов
/ 11 февраля 2011

Для GWT-RPC вы получите StatusCodeException всякий раз, когда сервер возвращает что-либо, кроме кода ответа 200.Код состояния может быть получен из исключения, и вы можете перенаправить через GWT с помощью Window.Location.assign (url).Для RequestBuilder доступ к коду состояния cqan возможен через response.getStatusCode ().

EDIT : код для перенаправления, если окно GWT не является корневым окном.

private native void redirect(String url)/*-{
  var win = $wnd;
  while (win.parent != null && win.parent != win)
    win = win.parent;
  win.location = url;
}-*/;
1 голос
/ 11 февраля 2011

В вашей реализации RequestCallback вы можете проверить response.getStatusCode().У нас есть Spring Security на бэкэнде, который подключен, чтобы заставить пользователя перейти на страницу входа в систему на основе формы, если они не аутентифицированы.После аутентификации он перенаправляет их обратно.

Например:

@Override
public void onResponseReceived(Request request, Response response) {
  if (SC_UNAUTHORIZED == response.getStatusCode()) {
    Window.Location.reload();
  }
}
0 голосов
/ 02 августа 2012

используйте try / catch для кодеров!

AsyncCallback<String> callback = new AsyncCallback<String>() {
        public void onFailure(Throwable caught) {
            try {
                throw caught;
            } catch (StatusCodeException statusCodeException) {
                Util.handleException(statusCodeException);
            } catch (Throwable exception) {
                Util.handleException(exception);
            }
        }

        public void onSuccess(String result) {
            Window.alert("Result : " + result);
        }
    };

затем обработать ваши результаты

final static public void handleException(StatusCodeException exception) {
        String errorMessage = exception.toString() + 
                              "\n CODE: " + exception.getStatusCode() + 
                              "\n MESSAGE: " + exception.getEncodedResponse();
        Window.alert("ERROR: " + errorMessage);
    }    
final static public void handleException(Throwable exception) {
        String errorMessage = exception.toString() + "\n";
        for (StackTraceElement trace : exception.getStackTrace()) {
            errorMessage += trace.getClassName() + " :: " + 
                            trace.getMethodName() + " :: " + 
                            trace.getLineNumber() + "\n";
        }
        Window.alert("ERROR: " + errorMessage);
    }

помни, что перегрузка - твой друг! Не забывайте, что если вы не скомпилируете свой код детально или красиво, вы получите мусор для трассировки стека. Если, конечно, кто-то не понял, как взломать класс JSStackEmulation

http://code.google.com/p/google-web-toolkit/wiki/WebModeExceptions

...