2013-01-14 5 views
1

을 유지하지 않습니다상태 저장 EJB 내 로그인 정보를 유지하기 위해 나는 상태 EJB를 사용하고 속성 값

@Named 
@RequestScoped 
public class LoginController { 

@Inject private SecurityService securityService; 

private String username;  
private String password; 

private Negozio negozio; 

public void login() throws IOException { 

    FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); 

    try { 

     if (request.getUserPrincipal() != null) { 
      request.logout(); 
     } 
     request.login(username, password); 

     securityService.setNegozioCorrente(negozio); 
     if (!securityService.authenticate()) { 
      throw new ServletException("Utente non abilitato."); 
     } 

     externalContext.redirect("/pippo/"); 

    } catch (ServletException e) { 
     e.printStackTrace(); 
     context.addMessage(null, new FacesMessage("Accesso Negato"));   
    } 
} 

public void logout() throws IOException { 
//... 

} 

public String getLoggedUsername() { 
    Utente utenteCorrente = securityService.getUtenteCorrente(); 
    String fullName = ""; 
    if (utenteCorrente!=null) { 
     fullName = utenteCorrente.getNomeCompleto(); 
    } else { 
     System.out.println("Utente NULLO"); 
    } 
    return fullName; 
} 
//... 

}

내 사용자가 실제로 내가 원하는 방식으로 로그인 할 수 있습니다 (프로그램 보안 내 도메인에서 일부 추가).

이미 내가 모든 페이지에 오신 것을 환영합니다! 당신은 #{loginController.loggedUsername}로 로그인 "헤더에 표시 할. 로그인 할 때 내가 가진 문제는 다음 페이지에 있습니다.

은 내가 점점 계속securityService.getUtenteCorrente()줍니다.

SecurityService EJB는! 내가이 상태 유지 EJB에 대해 뭔가 오해하고, 또는 난 그냥 예상대로 일이 뭔가를 생략 여부를 알고 싶어요.

내 목표를 무 상태 세션 빈처럼 동작 단지 "ses 사용자 상태를 유지하기위한 "sion-wide"빈. EJB가 필요하거나 SessionScoped JSF ManagedBean을 사용할 수 있습니까?

+1

관련 항목/dupe : http://stackoverflow.com/questions/8887140/jsf-request-scoped-bean-keeps-recreating-new-stateful-session-beans-on-every-req/ – BalusC

답변

4

LoginController은 요청 범위이며 사용자의 SecurityService은 종속 범위입니다 (모든 용도로 지정하지 않으면 세션 범위가 아닙니다). 따라서 두 번째 JSF 페이지가 EL 표현식에서 LoginController을 참조하면 LoginController의 새 인스턴스가 생성되어 SecurityService SFSB의 다른 인스턴스에 대한 참조를 갖게됩니다.

원래 SecurityService 인스턴스에 액세스해야하는 경우 으로 표시해야 클라이언트가 LoginController과 같은 요청에 액세스 할 수 있습니다. 그런 다음 @Stateful 주석이 필요한 이유를 먼저 고려해야 할 수도 있습니다.이 작업은 @SessionScoped 관리 빈으로 수행 할 수 있기 때문입니다. User/Principal 객체에 대한 참조를 저장하기 위해 SFSB가 실제로 필요하지는 않습니다.

+0

좋습니다, 감사합니다. 그것은 지금 일하지만 당신은 나를 생각하게했습니다. 나는 Stateful과 Stateless에 관한 것을 읽었지만 간단한 웹 어플리케이션에서 Stateful을위한 유즈 케이스를 찾을 수 없다. 나 한테 제안 할 수 있을까? 나는 이미 Stateless를 사용하여 EJB와 트랜잭션 메소드를 가지고있다. –

+2

@FabioB : SFSB 만 확장 된 지속성 컨텍스트를 참조 할 수 있기 때문에 SFSB는 일반적으로 CDI 대화에 사용됩니다. 웹 응용 프로그램에서 일반적으로 SFSB를 사용하여 여러 HTTP 요청에서 트랜잭션 방식으로 지속성 컨텍스트를 관리합니다. 전형적인 유스 케이스는 SFSB를 참조하여 데이터베이스에 의해 지원되는 마법사의 상태를 관리하는 JSF 구성 요소 (예 : 마법사)입니다. –

+0

여기에 매우 유용한 S.O.가 있습니다. 사용자! :) –

-1

관리되는 세션 빈은 @EJB 주석을 사용하여 선언해야하거나 JNDI를 사용하여 조회해야합니다. 삽입하는 방법은 실제로 앱 서버에서 관리하지 않는 일반 객체를 제공합니다. 사실 새 객체를 만듭니다. 언제든지 사용할 수 있습니다.

+0

"Inject" "EJB"가 내 문제를 해결하지 못했다. –

+0

맞아, 나는 @ EJB' end'@Inject'의 차이를 오해했습니다. 철저한 설명을 위해 @Vineet에 감사드립니다. – remigio