Вот как я реализовал проверку безопасности:
На стороне сервера я проверяю, что каждый запрос RequestFactory
связан с пользователем, который ранее вошел в систему. Для этого файл web.xml
(в каталоге war/WEB-INF) должен иметь сопоставление для класса сервлета. Вот запись из файла web.xml
:
<servlet>
<servlet-name>requestFactoryServlet</servlet-name>
<servlet-class>org.greatlogic.rfexample2.server.RFERequestFactoryServlet</servlet-class>
<init-param>
<param-name>symbolMapsDirectory</param-name>
<param-value>WEB-INF/classes/symbolMaps/</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>requestFactoryServlet</servlet-name>
<url-pattern>/gwtRequest</url-pattern>
</servlet-mapping>
Класс RFERequestFactoryServlet
содержит следующий код:
public class RFERequestFactoryServlet extends RequestFactoryServlet {
@Override
protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
throws IOException, ServletException {
if (!userIsLoggedIn(request)) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
else {
super.doPost(request, response);
}
}
private boolean userIsLoggedIn(final HttpServletRequest request) {
boolean result = false;
HttpSession session = request.getSession();
if (session != null) {
User user = (User)session.getAttribute("User");
result = user != null;
}
return result;
}
}
На стороне клиента мне нужно было перехватывать каждый ответ RequestFactory
, чтобы проверить наличие ошибки SC_UNAUTHORIZED
. Вы должны указать объекту RequestFactory
использовать конкретный RequestTransport
в вызове RequestFactory#initialize
, например так:
MyRequestFactory requestFactory = GWT.create(MyRequestFactory.class);
requestFactory.initialize(eventBus, new RFERequestTransport());
Мой класс RFERequestTransport
расширяет класс DefaultRequestTransport
:
public class RFERequestTransport extends DefaultRequestTransport {
private final class RFERequestCallback implements RequestCallback {
private RequestCallback _requestCallback;
private RFERequestCallback(final RequestCallback requestCallback) {
_requestCallback = requestCallback;
}
@Override
public void onError(final Request request, final Throwable exception) {
_requestCallback.onError(request, exception);
}
@Override
public void onResponseReceived(final Request request, final Response response) {
if (response.getStatusCode() == Response.SC_UNAUTHORIZED) {
// the login processing goes here
}
else {
_requestCallback.onResponseReceived(request, response);
}
}
} // end of the RFERequestCallback class
@Override
protected RequestCallback createRequestCallback(final TransportReceiver receiver) {
return new RFERequestCallback(super.createRequestCallback(receiver));
}
}
Когда RequestFactory
создает обратный вызов запроса, он вызывает мой метод, который создает мою собственную версию RequestCallback
. Если пользователь вошел в систему (как определено сервлетом), то он просто выполняет обычную RequestFactory
обработку; в противном случае я прохожу процесс входа в систему с пользователем. Часть процесса входа в систему включает в себя связь с сервером для проверки входа в систему ... если вход в систему прошел успешно, я создаю объект на сервере и сохраняю ссылку на него в атрибуте «Пользователь» - затем это проверяется в userIsLoggedIn
метод в классе сервлета.
person
Andy King
schedule
26.03.2013