가 나는 페이지와 솔루션을 구축 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;
}
}
당신이 JSF-2.2로 업그레이드 할 수 있습니다 경우는 모든 I 후 지금 – kolossus
여러 개의 창을 처리 JSF 2.2에서이 글을 읽었을 때 윈도우 ID가 양쪽 탭에서 같기 때문에 사용자가 새 탭에서 링크/버튼을 열면 작동하지 않는다. 어쨌든 JSF 2.2에 대한 업데이트는 현재 불가능합니다. – user1127860
JSF 2.2는 ClientWindow를 제공하지만 스코프를 관리하지는 않습니다. Seam3 대신 DeltaSpike를 사용하십시오. DeltaSpike는 그 길의 미래이며 단지 멋지다! –