브라우저 탭에서 세션을 달리하는 방법은 무엇입니까?


135

JSP 및 서블릿을 사용하여 Java로 구현 된 웹 애플리케이션에서; 사용자 세션에 정보를 저장하면이 정보는 동일한 브라우저의 모든 탭에서 공유됩니다. 브라우저 탭에서 세션을 달리하는 방법은 무엇입니까? 이 예에서 :

<%@page language="java"%>
<%
String user = request.getParameter("user");
user = (user == null ? (String)session.getAttribute("SESSIONS_USER") : user);
session.setAttribute("SESSIONS_USER",user);
%>
<html><head></head><body>
<%=user %>
<form method="post">
User:<input name="user" value="">
<input type="submit" value="send">
</form>
</body></html>

이 코드를 jsp 페이지 ( testpage.jsp) 에 복사 하고 서버에서 웹 응용 프로그램의 기존 컨텍스트 에이 파일을 배포 한 다음 (Apache Tomcat 사용) 올바른 URL ( localhost/context1/testpage.jsp)을 사용하여 브라우저 (FF, IE7 또는 Opera)를 열고 입력에 귀하의 이름과 양식을 제출하십시오. 그런 다음 동일한 브라우저에서 새 탭을 연 다음 새 탭에서 이름을 볼 수 있습니다 (세션에서 가져옴). 브라우저 캐시에주의하십시오. 때로는 발생하지 않는 것처럼 보이지만 캐시에 있으면 두 번째 탭을 새로 고칩니다.

감사.



1
이것은 사용자가해야 할 일입니다. IE를 열고 "파일-> 새 세션"을 클릭하십시오.
Stefan Steiger

3
@Quartary, 귀하의 솔루션은 일반적인 솔루션이 아니며 (다른 브라우저에서는 작동하지 않음) 가장 중요한 것은 사용자에게 친숙하지 않습니다 (사용자는 세션에 대해 알지 못함).
Oriol Terradas

2
어떤 사람들은 이것의 목적이 무엇인지 상상할 수없는 것 같습니다. 문제 도메인은 웹 사이트의 다른 "보기"를 허용하려는 모든 상황입니다. 사용자가 웹 사이트를 두 번 이상 볼 수있게되면 불가피하게 두 개의 다른보기에 동시에 액세스하려고합니다. 예를 들면 다음과 같습니다. 임시 버전 관리 (과거의 특정 시점에 존재했던 웹 사이트보기로 전환); 샌드 박싱 (다른 사람이 볼 수없는 웹 사이트를 변경 함); 역할 기반보기 (웹 사이트가 권한이 적은 사용자에게 어떻게 보이는지 확인) 등
론 버크

답변:


92

HTML5 SessionStorage (window.sessionStorage)를 사용할 수 있습니다. 임의의 ID를 생성하고 브라우저 탭마다 세션 저장소에 저장합니다. 그런 다음 각 브라우저 탭에는 고유 한 ID가 있습니다.

sessionStorage를 사용하여 저장된 데이터는 두 탭에 모두 동일한 도메인 출처의 웹 페이지가 포함되어 있어도 브라우저 탭간에 유지되지 않습니다. 즉, sessionStorage 내부의 데이터는 호출 페이지의 도메인 및 디렉토리뿐만 아니라 페이지가 포함 된 브라우저 탭으로 제한됩니다. 세션 쿠키와는 대조적으로, 데이터를 탭에서 탭으로 유지합니다.


7
문서에서 : "두 개의 탭에 모두 동일한 도메인 출처의 웹 페이지가 포함되어 있어도 sessionStorage를 사용하여 저장된 데이터는 브라우저 탭간에 유지되지 않습니다. 즉, sessionStorage 내의 데이터는 호출 페이지의 도메인 및 디렉토리뿐만 아니라 제한됩니다. 페이지가 포함 된 브라우저 탭. 탭에서 탭으로 데이터를 유지하는 세션 쿠키와 대조됩니다. " 간단한 테스트로 Chrome 및 FF에서이 동작이 확인됩니다.
jswanson

21
Chrome의 '중복 탭'기능을 사용하면 ID가 복제됩니다. 이것은 일반적으로 문제가되지 않지만 생각해야합니다.
JosiahDaniels

Chrome 또는 Firefox에서 탭을 "중복"할 때를 제외하고. 이 경우 SessionStorage가 복사됩니다.
Tiago Freitas Leal

@ Gonzalo Gallotti : 세션이 서버 측 인 경우 어떻게 도움이됩니까? )))
Stefan Steiger

@StefanSteiger. 그런 다음 Ajax Call과 함께 BrowserTab id (세션 스토리지에 저장)를 보낼 수 있습니다. WebSession은 동일하므로 서버 측에서는 사용자 정의 로직이 필요합니다. 그러나 탭별로 세션 객체로 HashMap을 만들 수 있습니다.
Gonzalo Gallotti

23

서버 측 세션은 HTTP에 대한 인공 추가 기능이라는 것을 알아야합니다. HTTP는 상태 비 저장이므로 서버는 요청이 알고 있고 세션을 가지고있는 특정 사용자의 요청임을 인식해야합니다. 이를 수행하는 두 가지 방법이 있습니다.

  • 쿠키. 더 깨끗하고 인기있는 방법이지만 한 명의 사용자가 모든 브라우저 탭과 창을 세션을 공유한다는 것을 의미합니다 .IMO 이것은 실제로 바람직하며 새 탭마다 로그인 한 사이트에서 매우 화가 나기 때문에 탭을 매우 집중적으로 사용
  • URL 재 작성 사이트의 모든 URL에는 세션 ID가 추가됩니다. 이것은 더 많은 작업이지만 (사이트 내부 링크가있는 모든 곳에서 무언가를해야합니다), 링크를 통해 열린 탭은 여전히 ​​세션을 공유하지만 다른 탭에서 별도의 세션을 가질 수 있습니다. 또한 사용자가 사이트에 올 때 항상 로그인해야 함을 의미합니다.

어쨌든 무엇을하려고합니까? 왜 탭이 별도의 세션을 갖기를 원하십니까? 세션을 전혀 사용하지 않고 목표를 달성 할 수있는 방법이 있습니까?

편집 : 테스트를 위해 다른 솔루션 (예 : 별도의 VM에서 여러 브라우저 인스턴스 실행)을 찾을 수 있습니다. 한 명의 사용자가 동시에 다른 역할을 수행해야하는 경우 하나의 로그인이 여러 역할을 가질 수 있도록 앱에서 "역할"개념을 처리해야합니다. 쿠키 기반 세션을 사용하여 브라우저 탭을 개별적으로 처리 할 수 ​​없기 때문에 URL 재 작성을 사용하거나 현재 상황에 따라 생활하는 것이 더 적합한 지 여부를 결정해야합니다.


6
사용자 정보와 환경을 유지하는 큰 응용 프로그램입니다. 누군가 다른 탭에서 테스트 또는 다른 역할을 위해 다른 사용자로 로그인하면 탭에서 정보를 교차시킵니다.
Oriol Terradas

이유에 관해서는 매우 늦은 추가 기능 : 예를 들어 내 사이트의 WHICH 페이지를 알기 위해서는 이것을 알아야합니다. 예를 들어 사용자는 페이지에서 페이지로 이동 한 것이 아니라 대신 탭에서 탭으로 이동).
Oliver Williams

16

window.name Javascript 속성은 탭 활동 전체에서 유지되지만 URL guff 대신 독립적으로 유지 될 수있는 유일한 것입니다.


3
window.sessionStorage도 마찬가지
felickz

3
사용자가 "새 탭에서 열기"를 선택하면 세션 저장소가 새 탭으로 복사되므로주의해야합니다. 자세한 내용은 링크를 원하지만 bugzilla.mozilla.org/show_bug.cgi?id=818389
felickz

2
사용자가 같은 탭에서 다른 페이지로 변경할 때 window.name 설정에 저장 한 내용은 다른 도메인에서도 계속 사용할 수 있습니다.
nakib

15

해서는 안됩니다. 이러한 작업을 수행하려면 즉시 URL을 작성하여 사용자가 응용 프로그램의 단일 인스턴스를 사용하도록 강제해야합니다 (세션 ID가 아닌) 세션 ID를 동일하게 사용하고 모든 URL에 전달하십시오.

왜 필요한지 모르겠지만 완전히 사용할 수없는 응용 프로그램을 만들지 않는 한 그렇게하지 마십시오.


9
사용자 정보와 환경을 유지하는 큰 응용 프로그램입니다. 누군가 다른 탭에서 테스트 또는 다른 역할을 위해 다른 사용자로 로그인하면 탭에서 정보를 교차시킵니다.
Oriol Terradas

38
이전 답변 알고 있지만 Google 메일을 사용하면 탭마다 다른 계정을 가질 수 있으며 "완전히 사용할 수없는 응용 프로그램"이 아닙니다
George

2
@George, 정답은 여전히 ​​옳습니다. 귀하의 예에서 url 번호는 쿠키에 저장된 계정의 색인을 나타냅니다. Google 메일은 모든 쿠키를 저장하고 URL에 따라 하나를 선택합니다.
Mhmd

5
대답이 여전히 옳은지 확실하지 않으면 분명히 할 수 있습니다. Gmail은 그렇게합니다. 그것이하는 방법에 관해서는, 그것은 우아하지 않을 수도 있지만 효과가 있으며 그것이 중요합니다
George

2
이전 답변이지만 Whatsapp과 Telegram에서는 두 개의 탭을 동시에 열 수 없습니다. 이것은 그들을 사용할 수 없게하지 않습니다
Charlie

13

약간의 오버 헤드가 있지만 프로토 타입으로 작동하는 것처럼 보이는 새로운 솔루션을 생각해 냈습니다. 탭을 전환 할 때마다 비밀번호를 다시 요청하면이 설정을 적용 할 수 있지만 한 가지 가정은 사용자가 로그인하기 위해 명예 시스템 환경에 있다는 것입니다.

localStorage (또는 이와 동등한) 및 HTML5 스토리지 이벤트를 사용하여 새 브라우저 탭이 활성화 된 사용자를 전환 한시기를 감지하십시오. 이 경우 현재 창을 사용할 수 없다는 메시지와 함께 고스트 오버레이를 작성하십시오 (또는 그렇지 않으면 창을 일시적으로 사용하지 않도록 설정하는 것이 바람직하지 않을 수 있습니다). 창에 초점이 다시 오면 AJAX 요청 로깅을 보내십시오. 다시 사용자.

이 접근 방식에 대한 한 가지 경고 : 일반적인 AJAX 호출 (예 : 세션에 의존하는 호출)은 포커스가없는 창에서 발생할 수 없습니다 (예 : 지연 후 호출이 발생한 경우). 그 전에 AJAX 재 로그인 호출을 수동으로 수행하십시오. 따라서 실제로 필요한 것은 AJAX 기능을 먼저 확인하여 localStorage.currently_logged_in_user_id === window.yourAppNameSpace.user_id를 확인하고 그렇지 않은 경우 AJAX를 통해 먼저 로그인하십시오.

다른 하나는 경쟁 조건입니다. 혼동하기에 충분히 빠른 속도로 창을 전환 할 수 있으면 relogin1-> relogin2-> ajax1-> ajax2 시퀀스가 ​​발생하고 ajax1이 잘못된 세션에서 생성 될 수 있습니다. 이 문제를 해결하려면 로그인 AJAX 요청을 어레이로 푸시 한 다음 저장시 새 로그인 요청을 발행하기 전에 모든 현재 요청을 중단하십시오.

마지막으로 살펴 봐야 할 것은 창 새로 고침입니다. AJAX 로그인 요청이 활성화되었지만 완료되지 않은 상태에서 누군가가 창을 새로 고치면 잘못된 사람의 이름으로 새로 고쳐집니다. 이 경우 비표준 beforeunload 이벤트를 사용하여 잠재적 믹스 업에 대해 사용자에게 경고하고 AJAX 로그인 요청을 재발행하는 동안 취소를 클릭하도록 요청할 수 있습니다. 그런 다음 요청을 완료하기 전에 확인을 클릭하거나 실수로 Enter / Spacebar를 누르는 것이 유감입니다. 불행히도이 경우 기본값은 기본값입니다.)이 경우를 처리하는 다른 방법이 있습니다. F5 및 Ctrl + R / Alt + R 누름 감지-대부분의 경우 작동하지만 사용자 키보드 단축키 재구성 또는 대체 OS 사용으로 인해 방해받을 수 있습니다. 그러나 이것은 실제로 약간의 경우입니다. 최악의 시나리오는 결코 그렇게 나쁘지 않습니다. 명예 시스템 구성에서는 잘못된 사람으로 로그인했을 것입니다 (그러나 색상, 스타일, 눈에 잘 띄게 표시되는 이름, 기타.); 비밀번호 구성에서, onus는 마지막으로 로그 아웃하거나 세션을 공유하기 위해 비밀번호를 입력 한 사람에게 있거나이 사람이 실제로 현재 사용자 인 경우 위반이 없습니다.

그러나 결국에는 프로파일을 설정하거나 IE를 사용하거나 URL을 다시 작성할 필요없이 탭당 하나의 사용자 당 응용 프로그램이 있어야합니다. 그래도 특정 탭에 로그인 한 각 탭에서 분명히해야합니다.


6
당신이 이것을 정말로 생각하는데 시간이 걸렸기 때문에 +1! :-) 모든주의 사항을 보면 그것이 나쁜 생각이라는 것을 알고 있습니다. 이 자료를 통해 얻은 교훈은 어떤 데이터가 세션에 들어가야하고 어떤 데이터를 사용하지 않아야하는지 진정으로 이해하는 것입니다.
Peter

10

우리는이 문제를 겪었고 매우 쉽게 해결했습니다. 프로그래밍이 필요하지 않기 때문에 쉽게 의미합니다. 우리가하고 싶었던 것은 사용자가 세션을 충돌시키지 않고 동일한 브라우저 창에서 여러 계정에 로그인하도록하는 것입니다.

따라서 솔루션은 임의의 하위 도메인이었습니다.

23423.abc.com
242234.abc.com
235643.abc.com

따라서 시스템 관리자에게 abc.com 대신 * .abc.com에 대한 SSL 인증서를 구성하도록 요청한 다음 사용자가 로그인을 시도 할 때마다 코드 변경이 거의없이 임의의 하위 도메인 번호가있는 탭에 로그인됩니다. 각 탭은 독립적으로 자체 세션을 가질 수 있습니다. 또한 충돌을 피하기 위해 사용자 ID의 해시 또는 md5를 사용하여 난수를 개발했습니다.


3
이것은 URL 재 작성에 대한 영리한 대안으로 보입니다. 눈에 띄지 만 눈에 띄지 않는 HTTP 호환 장소에서 원하는 변수 (세션 ID)로 끝납니다. 염두에 두어야 할 사항 : 1) DNS에 와일드 카드가 필요합니다. 분명히 2) 전체 웹 사이트는 사용자를 다시 "예 :"www "하위 도메인으로 라우팅하는 절대 URL을 피해야합니다. 3) 웹 크롤러를 차단하려는 경우 , 그러나 이것은 아마도 개인 웹 상황 일 수 있으므로 이미 수행되었을 수 있습니다. 이것을 공유해 주셔서 감사합니다!
Ron Burk

@ user3534653 : 나는 접근법을 좋아한다. 그러나 당신은 "프로그래밍이 필요 없다"고 말했다. 그런 다음 "코드 변경이 거의 없다"고 말합니다. 실제로, 약간의 코드 변경은 프로그래밍이 아닙니다. ;) 또한 도메인이 하드 코딩 / 구성된 (정규) 정식 링크가있는 여러 응용 프로그램이있는 경우이 방법이 작동하지 않을 수 있습니다.
Stefan Steiger

5

나는 정직 할 것이다. . . 위의 모든 것이 사실 일 수도 있고 아닐 수도 있지만 , 너무 복잡해 보이 거나 서버 측에서 어떤 탭이 사용되고 있는지 알지 못합니다.

때때로 우리는 Occam의 면도기를 적용해야합니다.

Occam의 접근 방식은 다음과 같습니다. (아니, Occam은 아닙니다. 그는 1347 년에 사망했습니다)

1)로드시 페이지에 브라우저 고유 ID를 할당하십시오. . . 창에 아직 ID가없는 경우에만 (접두사와 감지 기능을 사용하십시오)

2) 모든 페이지에서 (글로벌 파일 또는 무언가 사용) 단순히 포커스 이벤트 및 / 또는 마우스 오버 이벤트를 감지하기 위해 코드를 배치하십시오. (코드 작성을 쉽게하기 위해이 부분에 jquery를 사용합니다)

3) 포커스 (및 / 또는 마우스 오버) 기능에서 window.name으로 쿠키를 설정하십시오.

4) 탭 특정 데이터를 읽거나 써야 할 때 서버 측에서 쿠키 값을 읽으십시오.

고객 입장에서:

//Events 
$(window).ready(function() {generateWindowID()});
$(window).focus(function() {setAppId()});
$(window).mouseover(function() {setAppId()});


function generateWindowID()
{
    //first see if the name is already set, if not, set it.
    if (se_appframe().name.indexOf("SEAppId") == -1){
            "window.name = 'SEAppId' + (new Date()).getTime()
    }
    setAppId()
}

function setAppId()
{
    //generate the cookie
    strCookie = 'seAppId=' + se_appframe().name + ';';
    strCookie += ' path=/';

    if (window.location.protocol.toLowerCase() == 'https:'){
        strCookie += ' secure;';
    }

    document.cookie = strCookie;
}

서버 측 (C #-예를 들어 목적)

//variable name 
string varname = "";
HttpCookie aCookie = Request.Cookies["seAppId"];
if(aCookie != null) {
     varname  = Request.Cookies["seAppId"].Value + "_";
}
varname += "_mySessionVariable";

//write session data 
Session[varname] = "ABC123";

//readsession data 
String myVariable = Session[varname];

끝난.


1
나는 당신의 단순화 된 답변과 Occam의 면도기 참조를 정말로 좋아합니다. 이 솔루션이 여전히 효과가 있는지 다시 확인하고 싶었습니다.
Jeff Marino

1
페이지를 새로 고치면 세션을 유지해야하는 경우이 방법이 작동하지 않습니다. window.sessionStorage를 사용하는 또 다른 대답에서 제안 된 다른 접근법은 나에게 더 합리적입니다.
rosenfeld

@quijibo 그래도 여전히 내 응용 프로그램에서 완벽하게 작동합니다. 페이지를 새로 고침하는 경우, 일부 브라우저의 경우 window.sessionStorage를 사용하면 문제를 해결할 수 있지만 시도하지 않았을 수 있습니다.
Mike A.

3
"se_appframe ()"기능은 무엇입니까?
AndreMiranda

se_appframe 은 무엇입니까 ?
Kiquenet

2

단일 페이지에서 시작할 때 링크 재 작성을 사용하여 모든 URL에 고유 식별자를 추가 할 수 있습니다 (예 : index.html / jsp / whatever). 브라우저는 모든 탭에 동일한 쿠키를 사용하므로 쿠키에 넣은 모든 것이 고유 하지 않습니다 .


2
세션을 인코딩하기 위해 링크를 다시 작성하는 것은 지루하고 오류가 발생하기 쉽다고 생각합니다. 많은 링크가있는 큰 응용 프로그램이 있으며 투명한 솔루션이 필요하거나 구현하기 쉽습니다.
Oriol Terradas

2

아마 당신이 원하는 것은 탭마다 탐색 상태를 유지하고 탭 당 하나의 세션을 생성하는 것이 아니라고 생각합니다. 이것이 바로 Seam 프레임 워크가 대화 범위 / 컨텍스트를 통해 달성 한 것입니다. 이들의 구현은 대화 ID가 각 요청과 함께 전파되고 서버 측에서 대화 개념을 생성한다는 사실에 의존합니다. 이는 세션과 요청 사이에있는 것입니다. 탐색 흐름 제어 및 상태 관리가 가능합니다.

그것은 주로 JSF를 목표로하지만, 아이디어를 얻을 수있는 곳인지 살펴보고 확인하십시오 : http://docs.jboss.org/seam/latest/reference/en-US/html_single/#d0e3620



1

작동하는 또 다른 방법은 고유 창 ID를 작성하고이 값을 세션 ID와 함께 데이터베이스 테이블에 저장하는 것입니다. 내가 자주 사용하는 창 ID는 integer (지금)입니다. 이 값은 창을 새로 고치거나 다시로드하거나 자신에게 제출 한 경우 창을 열고 동일한 창에 다시 할당 할 때 작성됩니다. 창 값 (입력)은 링크를 사용하여 로컬 테이블에 저장됩니다. 값이 필요한 경우 창 ID / 세션 ID 링크를 기반으로 데이터베이스 테이블에서 가져옵니다. 이 방법에는 로컬 데이터베이스가 필요하지만 사실상 완전하지 않습니다. 데이터베이스 테이블을 사용하는 것은 쉽지만 로컬 배열이 제대로 작동하지 않는 이유는 없습니다.




1

참고 : 여기서 솔루션은 애플리케이션 디자인 단계에서 수행해야합니다. 나중에 이것을 설계하는 것은 어려울 것입니다.

숨겨진 필드를 사용하여 세션 식별자를 전달하십시오 .

이 작업을 수행하려면 각 페이지에 양식이 포함되어야합니다.

<form method="post" action="/handler">

  <input type="hidden" name="sessionId" value="123456890123456890ABCDEF01" />
  <input type="hidden" name="action" value="" />

</form>

내비게이션을 포함한 사용자 측의 모든 작업은 양식을 다시 게시합니다 ( action적절한 설정 ). 내용은 "안전하지 않은" 요청, 다른 매개 변수를 포함 할 수있다, 데이터의 JSON 값이 제출되어야 포함하는 말 :

<input type="hidden" name="action" value="completeCheckout" />
<input type="hidden" name="data" value='{ "cardNumber" : "4111111111111111", ... ' />

쿠키가 없으므로 각 탭은 독립적이며 동일한 브라우저에서 다른 세션에 대한 지식이 없습니다.

특히 보안과 관련하여 많은 장점이 있습니다.

  • JavaScript 또는 HTML5에 의존하지 않습니다.
  • CSRF 로부터 본질적으로 보호합니다 .
  • 쿠키에 의존하지 않으므로 POODLE 로부터 보호합니다 .
  • 세션 고정에 취약하지 않습니다 .
  • 사용자가 사이트를 통해 설정된 경로를 따라 가기를 원할 때 바람직한 뒤로 버튼 사용을 방지 할 수 있습니다 (즉, 순서가 잘못된 요청에 의해 공격받을 수있는 논리 버그를 방지 할 수 있음).

몇 가지 단점 :

  • 뒤로 버튼 기능이 필요할 수 있습니다.
  • 모든 작업이 POST이므로 캐싱에는 그다지 효과적이지 않습니다.

자세한 내용은 여기를 참조하십시오 .


1

나는 다음과 같은 방법으로 이것을 해결했다.

  • 창에 이름을 할당했습니다.이 이름은 연결 리소스와 동일합니다.
  • 접속 연결을 위해 쿠키에 저장된 1을 더한 값.
  • 모든 XML 출력 응답을 캡처하고 sid를 할당하고 json 형식의 쿠키를 제거하는 기능을 만들었습니다. 각 window.name에 대해이 작업을 수행합니다.

여기 코드가 있습니다 :

var deferred = $q.defer(),
        self = this,
        onConnect = function(status){
          if (status === Strophe.Status.CONNECTING) {
            deferred.notify({status: 'connecting'});
          } else if (status === Strophe.Status.CONNFAIL) {
            self.connected = false;
            deferred.notify({status: 'fail'});
          } else if (status === Strophe.Status.DISCONNECTING) {
            deferred.notify({status: 'disconnecting'});
          } else if (status === Strophe.Status.DISCONNECTED) {
            self.connected = false;
            deferred.notify({status: 'disconnected'});
          } else if (status === Strophe.Status.CONNECTED) {
            self.connection.send($pres().tree());
            self.connected = true;
            deferred.resolve({status: 'connected'});
          } else if (status === Strophe.Status.ATTACHED) {
            deferred.resolve({status: 'attached'});
            self.connected = true;
          }
        },
        output = function(data){
          if (self.connected){
            var rid = $(data).attr('rid'),
                sid = $(data).attr('sid'),
                storage = {};

            if (localStorageService.cookie.get('day_bind')){
              storage = localStorageService.cookie.get('day_bind');
            }else{
              storage = {};
            }
            storage[$window.name] = sid + '-' + rid;
            localStorageService.cookie.set('day_bind', angular.toJson(storage));
          }
        };
    if ($window.name){
      var storage = localStorageService.cookie.get('day_bind'),
          value = storage[$window.name].split('-')
          sid = value[0],
          rid = value[1];
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.attach('bosh@' + BoshDomain + '/' + $window.name, sid, parseInt(rid, 10) + 1, onConnect);
    }else{
      $window.name = 'web_' + (new Date()).getTime();
      self.connection = new Strophe.Connection(BoshService);
      self.connection.xmlOutput = output;
      self.connection.connect('bosh@' + BoshDomain + '/' + $window.name, '123456', onConnect);
    }

당신을 도울 수 있기를 바랍니다


0

나는 같은 일을하고 싶다고 생각했기 때문에이 게시물을 읽었습니다. 작업중 인 응용 프로그램과 비슷한 상황이 있습니다. 그리고 실제로는 실용성 이상의 테스트 문제입니다.

이 답변, 특히 Michael Borgwardt가 제공 한 답변을 읽은 후에는 존재 해야하는 작업 흐름을 깨달았습니다.

  1. 사용자가 로그인 화면으로 이동하면 기존 세션을 확인하십시오. 존재하는 경우 로그인 화면을 무시하고 시작 화면으로 보내십시오.
  2. 사용자 (필자의 경우)가 등록 화면으로 이동하면 기존 세션을 확인하십시오. 존재하는 경우 해당 세션에서 로그 아웃 할 것임을 사용자에게 알리십시오. 동의하면 로그 아웃하고 등록을 시작하십시오.

이것은 세션에서 사용자가 "다른 사용자의"데이터를 보는 문제를 해결합니다. 그들은 실제로 세션에서 "다른 사용자의"데이터를 보지 않고 열려있는 유일한 세션에서 데이터를 보았습니다. 분명히 일부 작업은 일부 세션 데이터를 덮어 쓰지만 다른 세션 데이터는 덮어 쓰지 않으므로 흥미로운 데이터가 발생할 수 있습니다. 따라서 단일 세션에 데이터 조합이 있습니다.

이제 테스트 문제를 해결합니다. 실행 가능한 유일한 접근 방식은 전 처리기 지시문 을 활용하는 것입니다. 하여 쿠키없는 세션을 사용해야하는지 여부를 결정하는 것입니다. 특정 환경에 대한 특정 구성을 구축하여 환경과 환경에 대해 몇 가지 가정을 할 수 있습니다. 이를 통해 기술적으로 두 명의 사용자가 동시에 로그인하도록 할 수 있으며 테스터는 해당 서버 세션에서 로그 아웃하지 않고도 동일한 브라우저 세션에서 여러 시나리오를 테스트 할 수 있습니다.

그러나이 방법에는 몇 가지 심각한 경고가 있습니다. 적어도 테스터가 테스트하는 것이 프로덕션 환경에서 실행될 것이 아니라는 사실은 무엇입니까 ?

그래서 나는 이것이 궁극적으로 나쁜 생각 이라고 말해야한다고 생각합니다.


0

timeStamp를 window.sessionStorage에 저장하지 않은 경우 저장합니다. URL이 동일하더라도 각 탭에 고유 한 값을 제공합니다.

http://www.javascriptkit.com/javatutors/domstorage.shtml

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage

도움이 되었기를 바랍니다.


1
이것은 아마도 괜찮지 만 이론적으로 안전하지 않습니다. 일부 운영 체제 (예 : Windows)에는 매우 거친 타임 스탬프 세분성이 있으므로 타임 스탬프를 여러 번 조회하여 동일한 값을 얻을 수 있습니다. 또한 충돌 후 브라우저를 다시 열고 모든 탭을 한 번에 다시 열면 동일한 타임 스탬프가 표시 될 수 있습니다.
길리

0
How to differ sessions in browser-tabs?

브라우저 탭에서 세션을 다르게하는 가장 간단한 방법은 특정 도메인에서 쿠키를 설정하지 못하게하는 것입니다. 이렇게하면 별도의 탭에서 별도의 세션을 가질 수 있습니다. 이 도메인 (www.xyz.com)에서 쿠키를 허용하지 않는다고 가정하십시오. 탭 1을 열고 로그인 한 후 탐색을 시작하십시오. 그런 다음 Tab 2를 열고 동일한 사용자 또는 다른 사용자로 로그인 할 수 있습니다. 어느 쪽이든, 탭 1과 별도의 세션이 있습니다.

그러나 물론 이것은 클라이언트 측을 제어 할 때 가능합니다. 그렇지 않으면 여기 사람들이 처방 한 솔루션이 적용되어야합니다.


0

당신은해야 할 것입니다

1- 계정 목록을위한 쿠키 저장

2- 옵션은 기본 쿠키를 저장합니다

acc1, acc2와 같은 색인을 가진 각 계정에 대해 3 개의 저장소

4- URL에 입력하면 계정 색인이 표시되며 그렇지 않은 경우 google mail domain.com/0/some-url >> 0과 같은 기본 계정을 선택합니다. 여기에서 계정 색인도 표시합니다. urlwrite를 사용하십시오

5- 쿠키를 선택할 때 urlpath에 따라 쿠키를 선택하여 계정 색인을 나타냅니다.

문안 인사


0

세션 ID 쿠키를 조작하기 위해 클라이언트 측이 변경된 많은 구현이 있습니다. 그러나 일반적으로 세션 ID 쿠키는 HttpOnly이어야하므로 자바 스크립트는 액세스 할 수 없습니다. 그렇지 않으면 XSS를 통해 세션 도용으로 이어질 수 있습니다


0

각 탭이 응용 프로그램에서 서로 다른 흐름을 실행하고 두 흐름을 혼합하면 문제가 발생하는 경우 각 흐름이 세션의 다른 영역을 사용하도록 세션 개체를 "지역화"하는 것이 좋습니다.

이 리젼은 각 플로우마다 다른 접 두부를 갖는 것처럼 간단하게 구현할 수 있으며, 세션 오브젝트는 여러 맵 (각 플로우마다 하나씩)을 보유하며 세션 속성 대신 해당 맵을 사용하므로 세션 클래스를 확장하는 것이 가장 좋습니다. 대신 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.