2014-12-02 15 views
0

내 응용 프로그램의 다중 창 처리에 문제가 있습니다. 현재 다중 창/탭 처리를 가능하게하는 대화 범위를 사용하고 있지만 사용자가 새 탭에서 링크 (버튼)를 여는 경우 이전 탭과 새 탭간에 대화가 공유됩니다.Deltaspike의 대안 3 Seam의 다중 창 처리

Apache Deltaspike는 (http://deltaspike.apache.org/documentation/#_module_overview)에 대한 해결책이 있지만 이미 Seam 3 (및 JSF 2.1)을 사용하고 있으며 Deltaspike로 마이그레이션하고 싶지 않습니다.

그래서 저는 Deltaspike가없는 대체 솔루션을 찾고 있습니까? 아니면 Deltaspike와 Seam 3을 사용할 수 있습니까? remoteCommand이 대답 :

+0

당신이 JSF-2.2로 업그레이드 할 수 있습니다 경우는 모든 I 후 지금 – kolossus

+0

여러 개의 창을 처리 JSF 2.2에서이 글을 읽었을 때 윈도우 ID가 양쪽 탭에서 같기 때문에 사용자가 새 탭에서 링크/버튼을 열면 작동하지 않는다. 어쨌든 JSF 2.2에 대한 업데이트는 현재 불가능합니다. – user1127860

+0

JSF 2.2는 ClientWindow를 제공하지만 스코프를 관리하지는 않습니다. Seam3 대신 DeltaSpike를 사용하십시오. DeltaSpike는 그 길의 미래이며 단지 멋지다! –

답변

0

가 나는 페이지와 솔루션을 구축 In javascript, how can I uniquely identify one browser window from another which are under the same cookiedbased sessionId

나는 이것이 window.name 각 browswer 탭에 대한 저장을 고유 ID를 만들어 내 템플릿에 JS했다. 그 다음은 페이지를 호출 remoteCommand이 GUID를 확인 :

$(window).load(function() { 
    // ---------------------- 
    var GUID = function() { 
     // ------------------ 
     var S4 = function() { 
      return (Math.floor(Math.random() * 0x10000 /* 65536 */ 
      ).toString(16)); 
     }; 
     return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); 
    }; 

    if (!window.name.match(/^GUID-/)) { 
     window.name = "GUID-" + GUID(); 
    } 

    if ($('#guid_form\\:server_guid').text().length == 0 || 
      $('#guid_form\\:server_guid').text() != window.name) { 
     checkGuid([{name:'guid', value:window.name}]); 
    } 
}) 

추가 위의 스크립트에 의해 호출 내 템플릿에 Primefaces remoteCommand.

<h:form id="guid_form"> 
    <h:outputText value="#{checkTabAction.guid}" id="server_guid"/> 
    <p:remoteCommand name="checkGuid" actionListener="#{checkTabAction.checkGuid}" process="@this" partialSubmit="true" /> 
</h:form> 

그리고

는 비교하여 현재의 브라우저 탭/창을 validateds 확인 작업을 추가 한 GUID의 :

@ConversationScoped 
@Named(value = "checkTabAction") 
public class CheckTabAction implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    private Logger log; 

    private String guid = null; 

    public void checkGuid() { 
     Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 
     String guid = params.get("guid").toString(); 

     if (this.guid == null) { 
      this.guid = guid; 
     } 

     if (!StringUtils.equals(this.guid, guid)) { 
      log.info("New tab detected!"); 
      throw new NonexistentConversationException("New tab detected!"); 
     } 
    } 

    public String getGuid() { 
     return guid; 
    } 

}