2011-02-10 2 views
2

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

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

Как узнать, когда в 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 содержание:

<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-виджета только.

+0

Вы используете GWT-RPC или RequestBuilder? – LINEMAN78

+0

Мы используем GWT-RPC – Cuga

+0

, этот подход фильтра будет перенаправлять ваш вызов rpc только в том случае, если сеанс истекает, вам нужно вернуть 405 клиенту. если вы перенаправите фильтр, он получит 200, но конечная точка изменится, и gwt не сможет анализировать данные. – LINEMAN78

ответ

3

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

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

+0

Это сложнее усложняет ситуацию, а также делает предположение, что он использует сервер Java. Существуют гораздо более простые чистые GWT-решения в зависимости от того, какой метод используется для выполнения запроса (GWT-RPC или RequestBuilder). Единственный метод, который не учитывает чистое решение GWT, - это JSONP из-за невозможности заголовков ответов сделать его через слой дополнений, и в этом случае ваше решение будет полезно, чтобы вы могли вернуть ответ в формате JSONP вместо JsonpRequiestBuilder время выхода и генерируемое общее исключение. – LINEMAN78

+0

Я считаю, что это точный подход, который мне нужен. Можете ли вы просмотреть обновленный вопрос и рекомендовать, как перенаправить пользователя, когда они не вошли в систему? – Cuga

+0

@Cuga, должен быть один быстрый дополнительный шаг, а затем все готово. Если вы поместили TODO в свой код, попробуйте добавить следующее: ((HttpServletResponse) res) .sendRedirect ("loginPageName"). Я также предполагаю, что оператор if должен быть «if (! IsLoggedIn)« not »if (isLoggedIn)». – brent777

1

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

Например:

@Override 
public void onResponseReceived(Request request, Response response) { 
    if (SC_UNAUTHORIZED == response.getStatusCode()) { 
    Window.Location.reload(); 
    } 
} 
2

Для 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; 
}-*/; 
+0

Спасибо. Есть ли способ перенаправить весь браузер? Мой код находится внутри виджета, поэтому Window.Location.assign() будет перенаправлять только этот виджет ... и я хочу перенаправить всю страницу – Cuga

+0

Это не имеет большого смысла ... Если виджет не является внутри и iFrame, но я добавлю код в свой ответ, который будет работать в ситуациях, когда вы не можете запускаться в корневом окне. – LINEMAN78

+0

Именно там, где они находятся - внутри iframe. Спасибо за код. – Cuga

0

использовать попытку/улов для кодеров!

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

Смежные вопросы