@Override
    protected Event doExecuteInternal(final RequestContext requestContext) throws Throwable {
        val browserStorage = new DefaultBrowserStorage()
            .setContext(WebUtils.getBrowserStorageContextKey(requestContext, this.browserStorageContextKey))
            .setStorageType(determineStorageType(requestContext));
        val storageResult = WebUtils.getBrowserStoragePayload(requestContext);
        if (storageResult.isPresent()) {
            val storageData = storageResult.get();
            browserStorage.setPayload(Objects.requireNonNull(storageData));
            hydrateWebflowFromStorage(browserStorage, requestContext);

            val targetState = WebUtils.getTargetState(requestContext);
            if (StringUtils.isBlank(targetState)) {
                WebUtils.putTargetState(requestContext, CasWebflowConstants.STATE_ID_TICKET_GRANTING_TICKET_CHECK);
            }
            requestContext.getFlowScope().remove(BROWSER_STORAGE_REQUEST_IN_PROGRESS);
            return result(CasWebflowConstants.TRANSITION_ID_SUCCESS, BrowserStorage.PARAMETER_BROWSER_STORAGE, browserStorage);
        }
        if (requestContext.getFlowScope().contains(BROWSER_STORAGE_REQUEST_IN_PROGRESS)) {
            requestContext.getFlowScope().remove(BROWSER_STORAGE_REQUEST_IN_PROGRESS);
            return result(CasWebflowConstants.TRANSITION_ID_SKIP);
        }
        WebUtils.putBrowserStorage(requestContext, browserStorage);
        requestContext.getFlowScope().put(BROWSER_STORAGE_REQUEST_IN_PROGRESS, Boolean.TRUE);
        return eventFactory.event(this, CasWebflowConstants.TRANSITION_ID_READ_BROWSER_STORAGE);
    }
Flag to indicate the read request is in progress and might be looping back.
core/cas-server-core-webflow-api/src/main/java/org/apereo/cas/web/flow/actions/storage/ReadBrowserStorageAction.java