Hello experts, I want to detect if user refreshed a page by pressing F5 or browser's refresh button or by any other means. Is there any way to check it?
I have written a PagePhaseListener from which I am navigating user to home page if the URL is not bookmarkable. I am determining if the URL is bookmarkable by checking if the value of a parameter "_bkm-state" of query string; for all bookmarkable URL the value of this parameter is true.
Also I have a checking on "_afrWindowMode" and "_afrWindowId". I have seen if a page is visited by pressing browser's back/forward button these two parameter get set to the URL, by the oracle.adfinternal.view.faces.webapp.rich.RichWindowManager.
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import oracle.adf.controller.ControllerContext;
import oracle.adf.controller.TaskFlowId;
import oracle.adf.controller.v2.context.LifecycleContext;
import oracle.adf.controller.v2.lifecycle.Lifecycle;
import oracle.adf.controller.v2.lifecycle.PagePhaseEvent;
import oracle.adf.controller.v2.lifecycle.PagePhaseListener;
import oracle.adf.share.Environment;
import oracle.adfinternal.controller.state.ControllerState;
import oracle.adfinternal.controller.state.RootViewPortContextImpl;
import org.apache.commons.lang3.StringUtils;
import com.mhis.posm.web.application.manager.BookmarkManager;
import com.mhis.posm.web.constant.TaskFlow;
import com.mhis.posm.web.utils.UrlUtils;
public class BookmarkInterceptingPagePhaseListener implements PagePhaseListener {
public BookmarkInterceptingPagePhaseListener() {
super();
}
public void afterPhase(PagePhaseEvent event){
}
@Override
public void beforePhase(PagePhaseEvent event){
if(event.getPhaseId() != Lifecycle.PREPARE_MODEL_ID) {
return;
}
LifecycleContext lifecycleContext = event.getLifecycleContext();
Environment environment = lifecycleContext.getEnvironment();
if(environment.getRequest() instanceof HttpServletRequest) {
HttpServletRequest servletRequest = (HttpServletRequest)environment.getRequest();
try {
ControllerState state = ControllerState.getInstance();
RootViewPortContextImpl rootViewPort = state.getCurrentRootViewPort();
if(StringUtils.equalsIgnoreCase(servletRequest.getMethod(),"GET") & StringUtils.contains(servletRequest.getRequestURI(),"adf.task-flow")) {
boolean bookmarkable = Boolean.valueOf(UrlUtils.getParameterValue(servletRequest.getQueryString(),"_bkm-state"));
boolean newWindow = StringUtils.isNotEmpty(UrlUtils.getParameterValue(servletRequest.getQueryString(),"_afrWindowMode")) || StringUtils.isNotEmpty(UrlUtils.getParameterValue(servletRequest.getQueryString(),"_afrWindowId"));
boolean returnedFromUCM = StringUtils.isNotEmpty(UrlUtils.getParameterValue(servletRequest.getQueryString(),"fromUCM"));
if(newWindow & !bookmarkable & !returnedFromUCM) {
TaskFlow defaultTaskFlow = TaskFlow.CATALOG_HOME;
TaskFlowId taskFlowId = new TaskFlowId(defaultTaskFlow.getDocument(), defaultTaskFlow.getId());
Map<String,Object> params = new HashMap<String,Object>();
params.put("_bkm-state",bookmarkable ? true : false);
params.put("_bkm-id",BookmarkManager.getInstance().getBookmark());
rootViewPort.redirectToUrl(ControllerContext.getInstance().getTaskFlowURL(false, taskFlowId,params));
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
But the drawback of this code is it is navigating to default home page if someone refresh the page which staying on a non-bookmarkable page.
Any pointer would be very helpful for me to solve the problem.
I am using JDeveloper 11.1.1.6.0.