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"))

同上