xPage超时和新登录

时间:2014-09-03 19:27:14

标签: xpages

我在超时发生后以及在xPage组件上单击somwhere时遇到这些问题:

  1. 它显示某个帧中的登录页面(不是单独的完整登录页面),例如如果我点击视图或数据表中的某个位置 - 它仍显示xPage但登录窗口出现在数据表框中

  2. 似乎所有CSS格式在重复登录后都失败了。

  3. 如何解决每个问题?假设它应该以某种方式重新加载超时/登录后不会发生的页面。

    由于

2 个答案:

答案 0 :(得分:2)

使用扩展库中的Keep Alive组件。或者使用这个xSnippet http://openntf.org/XSnippets.nsf/snippet.xsp?id=keeping-your-xpage-session-alive-%E2%80%93-without-keepsessionalive

如果您希望发生超时,请在onload事件中使用此代码

setInterval(function(){
XSP.partialRefreshGet("#{id:hiddenxpdiv}", {
   onError: function() {
window.location.href=window.location.href;
}}
}, 300000);

答案 1 :(得分:0)

您可以使用此问题答案中的小片段劫持XPage上的所有部分刷新:XPages: Get the contents of a - this._partialRefresh AJAX call?

在"劫持"函数,您可以检查服务器返回的特定标头,以确定您是否仍然登录。如果没有,您可以重定向或重新加载整个页面。

要添加标题,您可以在XPage的beforeRenderResponse事件中对其进行编码,或使用阶段监听器。阶段监听器可能如下所示:

package ch.hasselba.xpages.util;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletResponse;

public class IAmAlivePhaseListener implements PhaseListener {

    private static final long serialVersionUID = 1L;

    public void beforePhase(PhaseEvent event) {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        HttpServletResponse response = (HttpServletResponse) ec.getResponse();
        response.addHeader("X-I_AM_ALIVE", "1");
    }

    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    public void afterPhase(PhaseEvent event) {}

}

要激活阶段侦听器,您必须将其添加到 faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
  <lifecycle>
    <phase-listener>ch.hasselba.xpages.util.IAmAlivePhaseListener</phase-listener>
  </lifecycle>
</faces-config>

现在,HTTP标头 X-I_AM_ALIVE 已添加到任何有效的XPage请求中。

检查HTTP标头的代码如下所示:

if( !dojo._xhr )
  dojo._xhr = dojo.xhr; 

var loadOld;

function hijacked( response, ioArgs ){
  var isAlive = ioArgs.xhr &&
  ioArgs.xhr.getResponseHeader("X-I_AM_ALIVE");

  if( !isAlive ){
      window.location.href = window.location.href;
      return false;
  }

  loadOld( response, ioArgs ); // call the original function 
}

dojo.xhr = function( mode, args, bool ){
  loadOld = args["load"];
  args["load"] = hijacked;
  dojo._xhr( mode, args, bool );
}

一旦标头不可用,就会停止部分刷新/事件执行并重新加载整个站点。登录表单出现时,不会添加HTTP标头。

修改

在进行部分刷新时,客户端向服务器发送请求,并期望响应中的HTML覆盖/替换DOM树中的现有元素。替换的DOM元素由刷新ID定义。

对服务器的请求作为xhr请求发送,该请求在替换DOM之前首先检查返回码。如果发生错误(fe HTTP返回代码404),则调用部分刷新的 onError 方法,否则(HTTP返回代码200) onComplete

超时和XPage的问题是登录屏幕的HTTP响应代码总是200(OK)。当一个会话超时并且客户端向服务器发出xhr请求时,他会收到一个&#34;良好的响应&#34;从服务器并用返回的HTML代码替换现有的DOM。但在这种情况下,它是登录屏幕上的HTML。 用它替换刷新的DOM元素后,现有DOM的标记将被破坏,最终XPage不再起作用(因为JavaScript错误)。

虽然您无法在登录屏幕上添加HTTP标头或更改响应代码,但我的想法是反过来:不是在登录屏幕上添加标题并识别错误的响应& #34;,我的解决方案添加了一个标题来识别&#34; good&#34;响应。

在我看来,这是最简单的解决方案,可以在任何应用程序上运行而无需更改现有代码(只需添加几行并将CSJS添加到主题中)。