mirror of https://github.com/halo-dev/halo
Support redirecting to URI with fragment (#6817)
#### What type of PR is this? /kind bug /area core /milestone 2.20.x #### What this PR does / why we need it: This PR supports redirecting to URI with fragment. e.g.: <http://localhost:8090/login?redirect_uri=%2F%23afragment>(redirect_uri is `/#afragment`). #### Which issue(s) this PR fixes: Fixes #6767 #### Special notes for your reviewer: 1. Request <http://localhost:8090/login?redirect_uri=%2F%23afragment> 2. Log in 3. See the redirection #### Does this PR introduce a user-facing change? ```release-note None ```pull/6819/head
parent
25c54d792e
commit
99db7a6101
|
@ -44,6 +44,7 @@ public class HaloServerRequestCache extends WebSessionServerRequestCache {
|
||||||
public Mono<Void> saveRequest(ServerWebExchange exchange) {
|
public Mono<Void> saveRequest(ServerWebExchange exchange) {
|
||||||
var redirectUriQuery = exchange.getRequest().getQueryParams().getFirst(REDIRECT_URI_QUERY);
|
var redirectUriQuery = exchange.getRequest().getQueryParams().getFirst(REDIRECT_URI_QUERY);
|
||||||
if (StringUtils.isNotBlank(redirectUriQuery)) {
|
if (StringUtils.isNotBlank(redirectUriQuery)) {
|
||||||
|
// the query value is decoded, so we don't need to decode it again
|
||||||
var redirectUri = URI.create(redirectUriQuery);
|
var redirectUri = URI.create(redirectUriQuery);
|
||||||
return saveRedirectUri(exchange, redirectUri);
|
return saveRedirectUri(exchange, redirectUri);
|
||||||
}
|
}
|
||||||
|
@ -64,8 +65,11 @@ public class HaloServerRequestCache extends WebSessionServerRequestCache {
|
||||||
var requestPath = exchange.getRequest().getPath();
|
var requestPath = exchange.getRequest().getPath();
|
||||||
var redirectPath = RequestPath.parse(redirectUri, requestPath.contextPath().value());
|
var redirectPath = RequestPath.parse(redirectUri, requestPath.contextPath().value());
|
||||||
var query = redirectUri.getRawQuery();
|
var query = redirectUri.getRawQuery();
|
||||||
var finalRedirect =
|
var fragment = redirectUri.getRawFragment();
|
||||||
redirectPath.pathWithinApplication() + (query == null ? "" : "?" + query);
|
var finalRedirect = redirectPath.pathWithinApplication()
|
||||||
|
+ (query == null ? "" : "?" + query)
|
||||||
|
+ (fragment == null ? "" : "#" + fragment);
|
||||||
|
|
||||||
return exchange.getSession()
|
return exchange.getSession()
|
||||||
.map(WebSession::getAttributes)
|
.map(WebSession::getAttributes)
|
||||||
.doOnNext(attributes -> attributes.put(this.sessionAttrName, finalRedirect))
|
.doOnNext(attributes -> attributes.put(this.sessionAttrName, finalRedirect))
|
||||||
|
|
|
@ -33,23 +33,28 @@ class HaloServerRequestCacheTest {
|
||||||
@Test
|
@Test
|
||||||
void shouldSaveIfPageCacheable() {
|
void shouldSaveIfPageCacheable() {
|
||||||
var mockExchange = MockServerWebExchange.from(
|
var mockExchange = MockServerWebExchange.from(
|
||||||
MockServerHttpRequest.get("/archives").accept(MediaType.TEXT_HTML)
|
MockServerHttpRequest.get("/archives")
|
||||||
|
.queryParam("q", "v")
|
||||||
|
.accept(MediaType.TEXT_HTML)
|
||||||
);
|
);
|
||||||
requestCache.saveRequest(mockExchange)
|
requestCache.saveRequest(mockExchange)
|
||||||
.then(requestCache.getRedirectUri(mockExchange))
|
.then(requestCache.getRedirectUri(mockExchange))
|
||||||
.as(StepVerifier::create)
|
.as(StepVerifier::create)
|
||||||
.expectNext(URI.create("/archives"))
|
.expectNext(URI.create("/archives?q=v"))
|
||||||
.verifyComplete();
|
.verifyComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void shouldSaveIfQueryPresent() {
|
void shouldSaveIfRedirectUriPresent() {
|
||||||
var mockExchange =
|
var mockExchange = MockServerWebExchange.from(
|
||||||
MockServerWebExchange.from(MockServerHttpRequest.get("/login?redirect_uri=/halo?q=v"));
|
MockServerHttpRequest.get("/login")
|
||||||
|
.queryParam("redirect_uri", "/halo?q=v#fragment")
|
||||||
|
);
|
||||||
requestCache.saveRequest(mockExchange)
|
requestCache.saveRequest(mockExchange)
|
||||||
.then(requestCache.getRedirectUri(mockExchange))
|
.then(requestCache.getRedirectUri(mockExchange))
|
||||||
.as(StepVerifier::create)
|
.as(StepVerifier::create)
|
||||||
.expectNext(URI.create("/halo?q=v"));
|
.expectNext(URI.create("/halo?q=v#fragment"))
|
||||||
|
.verifyComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue