这里我使用的是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请求与常规请求?
答案 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"))
与上述相同。