2011-02-04 3 views
9

... 나는 ...session.invalidate를 사용하는 JSF 로그 아웃이 현재 사용자 이름을 지우지 않습니까? 내 JSF 응용 프로그램에서

public String getLoggedInUsername() { 
    return FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); 
} 

를 현재이 같은 로그인 한 사용자의 이름을 얻을 ... 그리고 사용자가 다음과 같이 로그인하면 내가 확인

public boolean isSignedIn() { 
    return (getLoggedInUsername() != null); 
} 

... 그리고 사용자가 로그 아웃, 나는 doLogout는()를 getLoggedInUsername()가 여전히 로그인 한 사용자의 이름을 반환 한 후

public String doLogout() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    HttpSession httpSession = (HttpSession)facesContext.getExternalContext().getSession(false); 
    httpSession.invalidate(); 
    return "main"; 
} 

내 문제가 ... 이렇게. 뭐 getRemoteUser()가 로그 아웃 후 null을 반환하는지 확인해야합니까?

대신 사용자 이름을 확인하는 것보다 isSignedIn()을 사용하는 것이 더 좋은 방법일까요?

감사합니다. Rob

+0

관련 메소드 자체를 디버깅 했습니까? 아니면 웹 브라우저 작동 방식에 따라 직접 추측 했습니까? 페이지는 브라우저 캐시에서 요청할 수 있습니다. – BalusC

+0

예, 디버깅했습니다. doLogout() 메소드가 완료되면 getLoggedInUsername()을 실행하고 로그인 한 사람의 사용자 이름을 반환합니다 (심지어 session.invalidate가 실행 된 후에도). 어떤 아이디어? –

+1

리디렉션을 보내고 있는지 알 수 없습니다. :) 기본 동작이 무엇이든간에 doLogOut() 브라우저를 사용하면 브라우저가 어떤 페이지에서든지 나가서 main.jsf 페이지를 볼 수 있습니다.이 페이지는 로그인 할 필요가 없습니다.). 그게 도움이 되니? –

답변

16

세션을 무효화 한 후에 요청을 리디렉션하고 있는지 확인하십시오. 사용자 주체는 세션 속성을 기반으로 결정됩니다. 따라서 대상 페이지 (기본적으로 JSF 탐색 케이스)로 전달하면 HttpSession 참조를 사용하므로 대상 페이지에 계속 남아 있습니다. 리디렉션은 웹 브라우저에게 새로운 HTTP 요청을 시작하도록 지시하여 서버가 새 요청을 기반으로 HttpSession 참조를 다시 생성하도록합니다.

내비게이션 케이스에 <redirect/>을 추가하면 JSF가 리디렉션을 보내도록 강제합니다. 또는 이미 JSF 2.0에있는 경우 ?faces-redirect=true을 결과 값에 추가하십시오.

0

"session.invalidate(); , "request.logout();"을 추가하십시오.

세션 개체에서 메서드를 무효화하면 세션 데이터가 정리됩니다.

메소드 요청시 logout 메소드는 getUserPrincipal, getRemoteUser 및 getAuthType이 요청에 대해 호출 될 때 반환되는 값으로 null을 설정합니다.

관련 문제