Cache Xor CsrfToken
Closes gh-11988
This commit is contained in:
@@ -59,12 +59,12 @@ public final class XorCsrfTokenRequestAttributeHandler extends CsrfTokenRequestA
|
||||
}
|
||||
|
||||
private Supplier<CsrfToken> deferCsrfTokenUpdate(Supplier<CsrfToken> csrfTokenSupplier) {
|
||||
return () -> {
|
||||
return new CachedCsrfTokenSupplier(() -> {
|
||||
CsrfToken csrfToken = csrfTokenSupplier.get();
|
||||
Assert.state(csrfToken != null, "csrfToken supplier returned null");
|
||||
String updatedToken = createXoredCsrfToken(this.secureRandom, csrfToken.getToken());
|
||||
return new DefaultCsrfToken(csrfToken.getHeaderName(), csrfToken.getParameterName(), updatedToken);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -123,4 +123,24 @@ public final class XorCsrfTokenRequestAttributeHandler extends CsrfTokenRequestA
|
||||
return xoredCsrf;
|
||||
}
|
||||
|
||||
private static final class CachedCsrfTokenSupplier implements Supplier<CsrfToken> {
|
||||
|
||||
private final Supplier<CsrfToken> delegate;
|
||||
|
||||
private CsrfToken csrfToken;
|
||||
|
||||
private CachedCsrfTokenSupplier(Supplier<CsrfToken> delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CsrfToken get() {
|
||||
if (this.csrfToken == null) {
|
||||
this.csrfToken = this.delegate.get();
|
||||
}
|
||||
return this.csrfToken;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -53,7 +53,8 @@ public final class XorServerCsrfTokenRequestAttributeHandler extends ServerCsrfT
|
||||
Assert.notNull(exchange, "exchange cannot be null");
|
||||
Assert.notNull(csrfToken, "csrfToken cannot be null");
|
||||
Mono<CsrfToken> updatedCsrfToken = csrfToken.map((token) -> new DefaultCsrfToken(token.getHeaderName(),
|
||||
token.getParameterName(), createXoredCsrfToken(this.secureRandom, token.getToken())));
|
||||
token.getParameterName(), createXoredCsrfToken(this.secureRandom, token.getToken())))
|
||||
.cast(CsrfToken.class).cache();
|
||||
super.handle(exchange, updatedCsrfToken);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user