protected static String getFinalTarget(ResourceHandle resource, List<String> trace) throws RedirectLoopException { String finalTarget = null; if (resource.isValid()) { String path = resource.getPath(); if (trace.contains(path)) { throw new RedirectLoopException(trace, path); } String redirect = resource.getProperty(PROP_TARGET); if (StringUtils.isBlank(redirect)) { redirect = resource.getProperty(PROP_REDIRECT); } if (StringUtils.isNotBlank(redirect)) { trace.add(path); finalTarget = redirect; if (!URL_PATTERN.matcher(finalTarget).matches()) { ResourceResolver resolver = resource.getResourceResolver(); Resource targetResource = resolver.getResource(finalTarget); if (targetResource != null) { String target = getFinalTarget(ResourceHandle.use(targetResource), trace); if (StringUtils.isNotBlank(target)) { finalTarget = target; } } } } } return finalTarget; }