@ -38,6 +38,8 @@ public final class LazyCsrfTokenRepository implements CsrfTokenRepository {
private final CsrfTokenRepository delegate ;
private final CsrfTokenRepository delegate ;
private boolean deferLoadToken ;
/ * *
/ * *
* Creates a new instance
* Creates a new instance
* @param delegate the { @link CsrfTokenRepository } to use . Cannot be null
* @param delegate the { @link CsrfTokenRepository } to use . Cannot be null
@ -48,6 +50,15 @@ public final class LazyCsrfTokenRepository implements CsrfTokenRepository {
this . delegate = delegate ;
this . delegate = delegate ;
}
}
/ * *
* Determines if { @link # loadToken ( HttpServletRequest ) } should be lazily loaded .
* @param deferLoadToken true if should lazily load
* { @link # loadToken ( HttpServletRequest ) } . Default false .
* /
public void setDeferLoadToken ( boolean deferLoadToken ) {
this . deferLoadToken = deferLoadToken ;
}
/ * *
/ * *
* Generates a new token
* Generates a new token
* @param request the { @link HttpServletRequest } to use . The
* @param request the { @link HttpServletRequest } to use . The
@ -77,6 +88,9 @@ public final class LazyCsrfTokenRepository implements CsrfTokenRepository {
* /
* /
@Override
@Override
public CsrfToken loadToken ( HttpServletRequest request ) {
public CsrfToken loadToken ( HttpServletRequest request ) {
if ( this . deferLoadToken ) {
return new LazyLoadCsrfToken ( request , this . delegate ) ;
}
return this . delegate . loadToken ( request ) ;
return this . delegate . loadToken ( request ) ;
}
}
@ -92,6 +106,55 @@ public final class LazyCsrfTokenRepository implements CsrfTokenRepository {
return response ;
return response ;
}
}
private final class LazyLoadCsrfToken implements CsrfToken {
private final HttpServletRequest request ;
private final CsrfTokenRepository tokenRepository ;
private CsrfToken token ;
private LazyLoadCsrfToken ( HttpServletRequest request , CsrfTokenRepository tokenRepository ) {
this . request = request ;
this . tokenRepository = tokenRepository ;
}
private CsrfToken getDelegate ( ) {
if ( this . token ! = null ) {
return this . token ;
}
// load from the delegate repository
this . token = LazyCsrfTokenRepository . this . delegate . loadToken ( this . request ) ;
if ( this . token = = null ) {
// return a generated token that is lazily saved since
// LazyCsrfTokenRepository#loadToken always returns a value
this . token = generateToken ( this . request ) ;
}
return this . token ;
}
@Override
public String getHeaderName ( ) {
return getDelegate ( ) . getHeaderName ( ) ;
}
@Override
public String getParameterName ( ) {
return getDelegate ( ) . getParameterName ( ) ;
}
@Override
public String getToken ( ) {
return getDelegate ( ) . getToken ( ) ;
}
@Override
public String toString ( ) {
return "LazyLoadCsrfToken{" + "token=" + this . token + '}' ;
}
}
private static final class SaveOnAccessCsrfToken implements CsrfToken {
private static final class SaveOnAccessCsrfToken implements CsrfToken {
private transient CsrfTokenRepository tokenRepository ;
private transient CsrfTokenRepository tokenRepository ;