以下是我实施安全检查的方式:
在服务器端,我检查每个RequestFactory 请求都与以前登录的用户相关联。为此,web.xml 文件(在 war/WEB-INF 目录中)必须有一个servlet 类的映射。这是来自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 对象在RequestFactory#initialize 调用中使用特定的RequestTransport,如下所示:
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 版本。如果用户已登录(由 servlet 确定),则它只执行正常的RequestFactory 处理;否则,我将与用户一起完成登录过程。登录过程的一部分涉及与服务器的通信以验证登录......如果登录成功,那么我在服务器上创建一个对象并将对它的引用存储在“用户”属性中 - 然后在@中检查servlet 类中的 987654340@ 方法。