21
21
import org .springframework .security .web .util .matcher .AnyRequestMatcher ;
22
22
import org .springframework .security .web .util .matcher .RequestMatcher ;
23
23
import org .springframework .util .Assert ;
24
+ import org .springframework .util .MultiValueMap ;
25
+ import org .springframework .util .StringUtils ;
24
26
import org .springframework .web .util .UriComponents ;
25
27
import org .springframework .web .util .UriComponentsBuilder ;
26
28
import org .springframework .web .util .WebUtils ;
29
31
import javax .servlet .http .HttpServletRequest ;
30
32
import javax .servlet .http .HttpServletResponse ;
31
33
import java .util .Base64 ;
34
+ import java .util .HashMap ;
32
35
33
36
34
37
/**
@@ -52,7 +55,7 @@ public void saveRequest(HttpServletRequest request, HttpServletResponse response
52
55
Cookie savedCookie = new Cookie (COOKIE_NAME , encodeCookie (redirectUrl ));
53
56
savedCookie .setMaxAge (COOKIE_MAX_AGE );
54
57
savedCookie .setSecure (request .isSecure ());
55
- savedCookie .setPath (request . getContextPath ( ));
58
+ savedCookie .setPath (getCookiePath ( request ));
56
59
savedCookie .setHttpOnly (true );
57
60
58
61
response .addCookie (savedCookie );
@@ -65,7 +68,7 @@ public void saveRequest(HttpServletRequest request, HttpServletResponse response
65
68
public SavedRequest getRequest (HttpServletRequest request , HttpServletResponse response ) {
66
69
Cookie savedRequestCookie = WebUtils .getCookie (request , COOKIE_NAME );
67
70
if (savedRequestCookie != null ) {
68
- String originalURI = decodeCookie (savedRequestCookie .getValue ());
71
+ final String originalURI = decodeCookie (savedRequestCookie .getValue ());
69
72
UriComponents uriComponents = UriComponentsBuilder .fromUriString (originalURI ).build ();
70
73
DefaultSavedRequest .Builder builder = new DefaultSavedRequest .Builder ();
71
74
@@ -77,32 +80,44 @@ public SavedRequest getRequest(HttpServletRequest request, HttpServletResponse r
77
80
port = 80 ;
78
81
}
79
82
}
83
+
84
+ final MultiValueMap <String , String > queryParams = uriComponents .getQueryParams ();
85
+
86
+ if (!queryParams .isEmpty ()) {
87
+ final HashMap <String , String []> parameters = new HashMap <>(queryParams .size ());
88
+ queryParams .forEach ((key , value ) -> parameters .put (key , value .toArray (new String []{})));
89
+ builder .setParameters (parameters );
90
+ }
91
+
80
92
return builder .setScheme (uriComponents .getScheme ())
81
93
.setServerName (uriComponents .getHost ())
82
94
.setRequestURI (uriComponents .getPath ())
83
95
.setQueryString (uriComponents .getQuery ())
84
96
.setServerPort (port )
97
+ .setMethod (request .getMethod ())
85
98
.build ();
86
99
}
87
100
return null ;
88
101
}
89
102
90
103
@ Override
91
104
public HttpServletRequest getMatchingRequest (HttpServletRequest request , HttpServletResponse response ) {
92
- SavedRequest savedRequest = getRequest (request , response );
93
- if (savedRequest != null ) {
94
- removeRequest (request , response );
95
- return new SavedRequestAwareWrapper (savedRequest , request );
105
+ SavedRequest saved = this .getRequest (request , response );
106
+ if (!this .matchesSavedRequest (request , saved )) {
107
+ this .logger .debug ("saved request doesn't match" );
108
+ return null ;
109
+ } else {
110
+ this .removeRequest (request , response );
111
+ return new SavedRequestAwareWrapper (saved , request );
96
112
}
97
- return null ;
98
113
}
99
114
100
115
@ Override
101
116
public void removeRequest (HttpServletRequest request , HttpServletResponse response ) {
102
117
Cookie removeSavedRequestCookie = new Cookie (COOKIE_NAME , "" );
103
118
removeSavedRequestCookie .setSecure (request .isSecure ());
104
119
removeSavedRequestCookie .setHttpOnly (true );
105
- removeSavedRequestCookie .setPath (request . getContextPath ( ));
120
+ removeSavedRequestCookie .setPath (getCookiePath ( request ));
106
121
removeSavedRequestCookie .setMaxAge (0 );
107
122
response .addCookie (removeSavedRequestCookie );
108
123
}
@@ -115,6 +130,23 @@ private static String decodeCookie(String encodedCookieValue) {
115
130
return new String (Base64 .getDecoder ().decode (encodedCookieValue .getBytes ()));
116
131
}
117
132
133
+ private static String getCookiePath (HttpServletRequest request ) {
134
+ final String contextPath = request .getContextPath ();
135
+ if (StringUtils .isEmpty (contextPath )) {
136
+ return "/" ;
137
+ }
138
+ return contextPath ;
139
+ }
140
+
141
+ private boolean matchesSavedRequest (HttpServletRequest request , SavedRequest savedRequest ) {
142
+ if (savedRequest == null ) {
143
+ return false ;
144
+ } else {
145
+ String currentUrl = UrlUtils .buildFullRequestUrl (request );
146
+ return savedRequest .getRedirectUrl ().equals (currentUrl );
147
+ }
148
+ }
149
+
118
150
/**
119
151
* Allows selective use of saved requests for a subset of requests. By default any
120
152
* request will be cached by the {@code saveRequest} method.
0 commit comments