3030public class StatefulRestTemplateInterceptor implements ClientHttpRequestInterceptor {
3131
3232 private static final Logger log = LoggerFactory .getLogger (StatefulRestTemplateInterceptor .class );
33- private List <String > cookies ;
33+ private final List <String > cookies = new ArrayList <>() ;
3434 private String xsrfToken ;
3535 private String xsrfCookie ;
3636
3737 @ Override
3838 public ClientHttpResponse intercept (HttpRequest request , byte [] body , ClientHttpRequestExecution execution ) throws IOException {
3939
40- HttpHeaders requstHeaders = request .getHeaders ();
41- if (cookies != null ) {
42- requstHeaders .addAll (HttpHeaders .COOKIE , cookies );
40+ // add cookies and XSRF token headers if present
41+ HttpHeaders requestHeaders = request .getHeaders ();
42+ if (!cookies .isEmpty ()) {
43+ requestHeaders .addAll (HttpHeaders .COOKIE , cookies );
4344 }
4445 if (xsrfToken != null ) {
45- requstHeaders .add ("X-XSRF-TOKEN" , xsrfToken );
46+ requestHeaders .add ("X-XSRF-TOKEN" , xsrfToken );
4647 }
4748 log .debug ("REQUEST: [{}], headers [{}]" , request .getURI (), request .getHeaders ());
4849 ClientHttpResponse response = execution .execute (request , body );
4950
51+ // update cookies and XSRF token for future requests
5052 HttpHeaders headers = response .getHeaders ();
51-
5253 List <String > returnedCookies = headers .getOrEmpty (HttpHeaders .SET_COOKIE );
5354 if (!returnedCookies .isEmpty ()) {
54- if (cookies == null ) {
55- cookies = new ArrayList <>();
56- } else {
57- for (String cookie : returnedCookies ) {
58- String cookieName = getPrefixBeforeEquals (cookie );
59- cookies .removeIf (str -> str .startsWith (cookieName ));
60- }
55+ for (String cookie : returnedCookies ) {
56+ String cookieName = getCookieName (cookie );
57+ cookies .removeIf (str -> str .startsWith (cookieName ));
6158 }
6259 cookies .addAll (returnedCookies );
63- log .debug ("Adding new cookies {}, to existing cookies {}" , returnedCookies , cookies );
60+ log .debug ("Received new cookies {}, updated/merged cookies {}" , returnedCookies , cookies );
6461
6562 response .getHeaders ().get (HttpHeaders .SET_COOKIE ).stream ().filter (cookie -> cookie .startsWith ("XSRF-TOKEN" )).findAny ().ifPresent (cookie -> xsrfCookie = cookie );
6663 if (xsrfCookie != null ) {
6764 xsrfToken = xsrfCookie .substring (xsrfCookie .indexOf ('=' ) + 1 , xsrfCookie .indexOf (';' ));
6865 log .debug ("Response: [{}], set xsrfToken to [{}]" , request .getURI (), xsrfToken );
69- } else {
70- xsrfToken = null ;
7166 }
72- } else {
73- xsrfToken = null ;
7467 }
7568 return response ;
7669 }
77- public static boolean containsJSessionId (List <String > list ) {
78- for (String str : list ) {
79- if (str .startsWith ("JSESSIONID=" )) {
80- return true ;
81- }
82- }
83- return false ;
84- }
85- public static String getPrefixBeforeEquals (String str ) {
70+
71+ public static String getCookieName (String str ) {
8672 int equalsIndex = str .indexOf ('=' );
8773 if (equalsIndex != -1 ) {
8874 return str .substring (0 , equalsIndex );
8975 } else {
9076 return str ;
9177 }
9278 }
93-
9479}
0 commit comments