Oracle ADF:Response.sendRedirect 不适用于 PPR 请求
Oracle ADF: Response.sendRedirect is not working for PPR requests
这里我使用的是 Oracle ADF 12c。
我正在使用过滤器进行 session 过期处理。
如果 session 过期则重定向到登录页面如下:
response.sendRedirect("/myapp/faces/login.jsp");
但是如果来自浏览器的请求是 PPR(部分页面呈现)请求,那么上述指定的重定向将不起作用。
为了解决这个问题,我尝试了以下 post.
中指定的解决方案
现在重定向可以很好地处理 PPR 请求。但由于特殊的部分响应 xml.
,它不适用于常规请求
为了区分 PPR 请求和常规请求,我添加了上面指定的以下检查 post。
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
// It's a JSF ajax request.
}
但 ADF PPR 请求未发送请求 header“Faces-Request”。因此,包括 PPR 请求在内的所有请求都被视为常规请求。
如何区分 ADF PPR 请求和常规请求?
ADF 中部分响应的指标是在请求 headers 或请求参数中存在键 "Adf-Rich-Message"。该密钥从 11g 开始就存在,对 12c 来说不是新的。
在过滤器中,您没有 FacesContext object,因此直接在 ServletRequest 上查找密钥。
boolean isPartialRequest = "true".equals(request.getParameter("Adf-Rich-Message")) || "true".equals(request.getHeader("Adf-Rich-Message"));
如果您正在实施检查 post JSF 上下文初始化,则以下检查应该有效:
FacesContext.getPartialViewContext().isAjaxRequest()
或
ExternalContext ec = FacesContext.getExternalContext();
boolean isPartialRequest = "true".equals(ec.getRequestHeaderMap().get("Adf-Rich-Message")) || "true".equals(ec.getRequestParameterMap().get("Adf-Rich-Message"))
同上
这里我使用的是 Oracle ADF 12c。 我正在使用过滤器进行 session 过期处理。
如果 session 过期则重定向到登录页面如下:
response.sendRedirect("/myapp/faces/login.jsp");
但是如果来自浏览器的请求是 PPR(部分页面呈现)请求,那么上述指定的重定向将不起作用。
为了解决这个问题,我尝试了以下 post.
中指定的解决方案现在重定向可以很好地处理 PPR 请求。但由于特殊的部分响应 xml.
,它不适用于常规请求为了区分 PPR 请求和常规请求,我添加了上面指定的以下检查 post。
if ("partial/ajax".equals(request.getHeader("Faces-Request"))) {
// It's a JSF ajax request.
}
但 ADF PPR 请求未发送请求 header“Faces-Request”。因此,包括 PPR 请求在内的所有请求都被视为常规请求。
如何区分 ADF PPR 请求和常规请求?
ADF 中部分响应的指标是在请求 headers 或请求参数中存在键 "Adf-Rich-Message"。该密钥从 11g 开始就存在,对 12c 来说不是新的。
在过滤器中,您没有 FacesContext object,因此直接在 ServletRequest 上查找密钥。
boolean isPartialRequest = "true".equals(request.getParameter("Adf-Rich-Message")) || "true".equals(request.getHeader("Adf-Rich-Message"));
如果您正在实施检查 post JSF 上下文初始化,则以下检查应该有效:
FacesContext.getPartialViewContext().isAjaxRequest()
或
ExternalContext ec = FacesContext.getExternalContext();
boolean isPartialRequest = "true".equals(ec.getRequestHeaderMap().get("Adf-Rich-Message")) || "true".equals(ec.getRequestParameterMap().get("Adf-Rich-Message"))
同上