簡體   English   中英

JSF / a4j混搭-查看狀態ID已過期

[英]JSF/a4j Mashups - View State ID Expired

我們有一組Web模塊,它們是彼此的對等應用程序。 我們使用jQuery將它們融合在一起。 這些不同的模塊都使用JSF。 不同的模塊可以部署在不同的Java EE應用程序服務器上。

想象一下一個用於開設帳戶的JSF頁面。 該頁面可能利用客戶搜索功能來查找要為其打開帳戶的客戶。 從一個Web模塊提供帶有開戶表格的JSF頁面,從另一個Web模塊提供客戶搜索頁面。

...jsf page loaded from http://openaccount.com/openForm.xhtml

... code to load a search from from elsewhere...
<script type="text/javascript">
   jQuery(document).ready(function () {
      jQuery('#search_gadget').load('http://search.com/searchForm.xhtml');
                        });
</script>
<search_gadget/>
<br/> .. the rest of the open account form...

... searchForm和openForm都是JSF / a4j頁面。

現在,麻煩在於,當searchForm'gadget'確實執行了a4j調用以執行搜索並由此返回了新的視圖狀態ID時,openForm.xhtml的視圖狀態ID也將被更新。 然后使用openForm.xhtml將表單發布到服務器時,視圖狀態ID不同步(因為它們最后一次通過a4j調用而更新到另一個Web模塊,該Web模塊具有不同的服務器側視圖狀態)。

有沒有辦法隔離適用於上述方式的視圖狀態ID? 在哪里我們希望能夠將jsf視圖狀態隔離到來自不同Web模塊的混搭組件中?

所以,這就是我們最終要做的...

我們所有離散的Web模塊都具有相同的域,但是每個模塊都有唯一的上下文根www.bank.com/ waw / accounts /somepage.xhtml或www.bank.com/ waw / transfers /somepage.xhtml。 我們使用這些上下文根來確定應該更新其視圖狀態的表單的范圍。

像這樣(此解決方案不適用於所有想要混搭的人,但它對我們有用)...

var wlf_a4jAjaxProcessResponse = A4J.AJAX.processResponse;

function wlf_ajaxIsolate(req){

wlf_saveViewState(req.form);
wlf_a4jAjaxProcessResponse(req);
wlf_restoreViewState();
}

A4J.AJAX.processResponse = wlf_ajaxIsolate;     


function wlf_saveViewState(form) {

  var action = form.baseURI;

  if (typeof action !== 'undefined') {

        var i1 = action.indexOf("/waw/");
        var i2 = action.indexOf("/", i1+5);
        var currentPwa = action.substring(i1+5, i2);

        jQuery("#javax\\.faces\\.ViewState").each(function() {

              var form = jQuery(this).closest("form");
              var formAction = jQuery(form).attr('action');
              var i3 = formAction.indexOf("/waw/");
              var i4 = formAction.indexOf("/", i3+5);
              var pwa = formAction.substring(i3+5, i4);

              if (pwa !== currentPwa) {
                jQuery(this).attr('id',"_javax.faces.ViewState_");
                jQuery(this).attr('name',"_javax.faces.ViewState_");    
              }
        });
  }
};


function wlf_restoreViewState() {

  jQuery("#_javax\\.faces\\.ViewState_").each(function() {

        jQuery(this).attr('id',"javax.faces.ViewState");
        jQuery(this).attr('name',"javax.faces.ViewState");            
  });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM