我正在尝试为我的应用程序实现XSRF。我按照gwtproject.org提供的指南进行操作。我甚至设置了一个演示,它工作正常。正如指南中所提到的,我用另一个异步调用包装异步调用来获取XSRF令牌,一切正常。
XsrfTokenServiceAsync xsrf = (XsrfTokenServiceAsync)GWT.create(XsrfTokenService.class);
((ServiceDefTarget)xsrf).setServiceEntryPoint(GWT.getModuleBaseURL() + "xsrf");
xsrf.getNewXsrfToken(new AsyncCallback<XsrfToken>() {
public void onSuccess(XsrfToken token) {
MyServiceAsync rpc = (MyServiceAsync)GWT.create(MyService.class);
((HasRpcToken) rpc).setRpcToken(token);
// make XSRF protected RPC call
rpc.doStuff(new AsyncCallback<Void>() {
// ...
});
}
public void onFailure(Throwable caught) {
try {
throw caught;
} catch (RpcTokenException e) {
// Can be thrown for several reasons:
// - duplicate session cookie, which may be a sign of a cookie
// overwrite attack
// - XSRF token cannot be generated because session cookie isn't
// present
} catch (Throwable e) {
// unexpected
}
});
我的问题:我是否应该为每个异步调用进行两次异步调用才能使XSRF安全,即One获取XSRF令牌和其他实际的异步调用?他们是一种让每个浏览器会话使用XSRF令牌的方法吗?我问的原因是,我们已经是一个完全编码的应用程序,如果是前者,我必须编辑每个异步调用并使其XSRF安全,更不用说,性能将是一个问题,因为我有每次进行2次异步调用。
答案 0 :(得分:0)
只有一个异步调用 - 而不是两个。您的客户端只需要获取一次令牌,然后您只需告诉您的服务在每次后续RPC调用中都包含此令牌。
我实际上是使用JSP将此标记添加到主机页面 - 将其设置为JavaScript变量,然后从我的代码中访问它。