Oracle ADF:Response.sendRedirect不适用于PPR请求

时间:2017-01-24 06:31:24

标签: jsf servlet-filters oracle-adf

这里我使用的是Oracle ADF 12c。 我正在使用Filter进行会话到期处理。

如果会话已过期,则重定向到登录页面,如下所示:

array (size=5)
  0 => 
    object(stdClass)[1]
      public 'startTime' => string '07:00:00' (length=8)
      public 'endTime' => string '07:50:00' (length=8)
      public 'elapsed_mins' => string '50' (length=2)
  1 => 
    object(stdClass)[2]
      public 'startTime' => string '07:50:00' (length=8)
      public 'endTime' => string '08:50:00' (length=8)
      public 'elapsed_mins' => string '60' (length=2)
  2 => 
    object(stdClass)[3]
      public 'startTime' => string '08:50:00' (length=8)
      public 'endTime' => string '09:50:00' (length=8)
      public 'elapsed_mins' => string '60' (length=2)
  3 => 
    object(stdClass)[4]
      public 'startTime' => string '09:50:00' (length=8)
      public 'endTime' => string '10:10:00' (length=8)
      public 'elapsed_mins' => string '20' (length=2)
  4 => 
    object(stdClass)[5]
      public 'startTime' => string '10:10:00' (length=8)
      public 'endTime' => string '15:00:00' (length=8)
      public 'elapsed' => int 290

但是,如果来自浏览器的请求是PPR(部分页面呈现)请求,则上述指定的重定向不起作用。

要解决此问题,我尝试了以下post中指定的解决方案。

现在重定向正常用于PPR请求。但由于特殊的部分响应xml,它不适用于常规请求。

为了区分PPR请求和常规请求,我在上面的帖子中添加了以下检查。

response.sendRedirect("/myapp/faces/login.jsp");

但ADF PPR请求未发送请求标头“ Faces-Request ”。所以包括PPR请求在内的所有请求都被视为常规请求。

如何区分ADF PPR请求与常规请求?

1 个答案:

答案 0 :(得分:3)

ADF中部分响应的指标是存在密钥" Adf-Rich-Message"在请求标头或请求参数中。密钥自11g以来就存在,并且不是12c的新手。

在过滤器中,您没有FacesContext对象,因此直接在ServletRequest上查找键。

boolean isPartialRequest = "true".equals(request.getParameter("Adf-Rich-Message")) || "true".equals(request.getHeader("Adf-Rich-Message"));

如果您正在实施检查后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"))

与上述相同。