2014-09-03 56 views
0

我有這些問題發生超時後,當我點擊somwhere上的XPage組件:XPAGE超時和新的登錄

  1. 它顯示登錄頁面在某些幀(而不是作爲一個獨立的完整的登錄頁面),例如如果我點擊視圖或數據表中的某處 - 它仍然顯示xPage,但登錄窗口出現在數據表框架中

  2. 似乎所有CSS格式化在重複登錄後都失敗。

如何解決每個問題?假設它應該以某種方式重新加載超時/登錄後不會發生的頁面。

謝謝

回答

2

使用Extension庫中的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); 
+0

但我確實希望發生超時 – VladP 2014-09-03 20:10:14

+0

進行部分刷新,如果出現錯誤,請執行全面刷新。然後登錄頁面應該全屏顯示 – 2014-09-03 21:28:10

+0

我應該在哪裏進行部分刷新?如果我點擊窗體上的任何地方(按鈕,字段,視圖,視圖列排序等),則會發生問題。 – VladP 2014-09-04 16:30:13

0

你可以使用小片段在這個問題的答案劫持上XPage的所有部分refreshs :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已添加到任何有效的XPages請求中。

的代碼來檢查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標題。

編輯:

當執行局部刷新,所述客戶端發送請求到服務器,並且在覆蓋/替換在DOM樹中的現有元件的響應預期HTML。被替換的DOM元素由刷新ID定義。

對服務器的請求是作爲xhr請求發送的,它在替換DOM之前首先檢查返回代碼。如果發生錯誤(例如,HTTP返回碼404),則調用部分刷新的方法,否則(HTTP返回碼200)012。

超時和XPages的問題是登錄屏幕的HTTP響應代碼始終爲200(確定)。當會話超時並且客戶端向服務器發出xhr請求時,他會從服務器收到「良好響應」,並用返回的HTML代碼替換現有的DOM。但在這種情況下,它是來自登錄屏幕的HTML。 用它替換了刷新的DOM元素後,現有DOM的標記被破壞,最終XPage不再工作(由於JavaScript錯誤)。

雖然您不能將HTTP標頭添加到登錄屏幕或更改響應代碼,但我的想法是反過來:與向登錄屏幕添加標頭並識別「不良響應」相反,我的解決方案添加了一個標題來標識「良好」的響應。

在我看來,這是最簡單的解決方案,它可以在任何應用程序上工作,而無需更改現有代碼(只需添加幾行並將CSJS添加到主題中)。

+0

有沒有優雅的解決方案?我發現渲染問題發生在使用OneUI主題和擴展庫應用程序佈局的頁面 – VladP 2014-09-10 17:46:11

+0

@VladP:更新了我的答案。 – 2014-09-11 08:07:02