PhaseListener erro

Boa noite, pessoal, seguinte coloquei um exemplo de PhaseListener que peguei do exemplo do netbeans e outros que achei na net para fazer um filtro para autenticação, porem quando eu declaro ele no faces config a minha aplicação não roda ele apenas fica uma pagina em branco ao inves de redirecionar para minha pagina principal… o home, e se eu ponho parece que o browser entra em loop infinito :confused: e ja tentei varios e ainda não consegui resolver
alguem pode me ajudar?

segue o código do PhaseListener

[code]package autenticacao;

import apresentacao.managedbean.EmpresaManagedBean;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

/**

  • This PhaseListener will be take action before

  • the Restore View phase is invoked. This allows

  • us to check to see if the user is logged in before allowing them

  • to request a secure resource. If the user isn’t logged in, then

  • the listener will move the user to the login page.

  • @author rlubke
    */
    public class AuthenticationPhaseListenerEmpresa implements PhaseListener {

    /**

    • The outcome to trigger navigation to the login page.

    */
    private static final String USER_LOGIN_OUTCOME = “loginEmpresa”;

    // ---------------------------------------------- Methods from PhaseListener

    /**

    • Determines if the user is authenticated. If not, direct the

    • user to the login view, otherwise all the user to continue to the

    • requested view.

    • Implementation Note: We do this in the afterPhase

    • to make use of the NavigationHandler.


      */
      public void afterPhase(PhaseEvent event) {
      FacesContext context = event.getFacesContext();

      if (userExists(context)) {
      // allow processing of the requested view
      return;
      } else {
      // send the user to the login view
      if (requestingSecureView(context)) {
      context.responseComplete();
      context.getApplication().
      getNavigationHandler().handleNavigation(context,
      null,
      USER_LOGIN_OUTCOME);
      }
      }
      }

    /**

    • This is a no-op.

    */
    public void beforePhase(PhaseEvent event) {
    }

    /**

    • @return PhaseId.RESTORE_VIEW
      */
      public PhaseId getPhaseId() {
      return PhaseId.RESTORE_VIEW;
      }

    // --------------------------------------------------------- Private Methods

    /**

    • Determine if the user has been authenticated by checking the session

    • for an existing Wuser object.
    • @param context the FacesContext for the current request
    • @return true if the user has been authenticated, otherwise
    • false
      */
      private boolean userExists(FacesContext context) {
      ExternalContext extContext = context.getExternalContext();
      return (extContext.getSessionMap().containsKey(EmpresaManagedBean.USER_SESSION_KEY));
      }

    /**

    • Determines if the requested view is one of the login pages which will

    • allow the user to access them without being authenticated.
    • Note, this implementation most likely will not work if the

    • FacesServlet is suffix mapped.
    • @param context the FacesContext for the current request
    • @return true if the requested view is allowed to be accessed
    • without being authenticated, otherwise false
      */
      private boolean requestingSecureView(FacesContext context) {
      ExternalContext extContext = context.getExternalContext();
      String path = extContext.getRequestPathInfo();
      return (!"/login.jsp".equals(path) && !"/create.jsp".equals(path));
      }
      }[/code]

alguem?

sera que é por causa do facelets??

Oi naruto, creio que voce nao deveria fazer o context.responseComplete(), estou enganado?

Ola Paulo, boa noite, se eu faço isso ele ja me redireciona logo para a pagina de login e não é isso que eu quero pois quero acessar uma pagina inicial onde qualquer um pode ver e dali tem um menu onde leva ele ate o login e outro problema que aconteceu fazendo isso foi que ele me redireciona para a pagina de login e não sai dali mesmo eu tentando acessar outras opções ele so fica na pagina de login

sabe porque?

Obrigado

[quote=Naruto]Ola Paulo, boa noite, se eu faço isso ele ja me redireciona logo para a pagina de login e não é isso que eu quero pois quero acessar uma pagina inicial onde qualquer um pode ver e dali tem um menu onde leva ele ate o login e outro problema que aconteceu fazendo isso foi que ele me redireciona para a pagina de login e não sai dali mesmo eu tentando acessar outras opções ele so fica na pagina de login

sabe porque?

Obrigado[/quote]

O seu parametro url-pattern do Faces Servlet no arquivo web.xml está utilizando qual formato?

Coloca aqui também a configuração da navegacão do loginEmpresa que está no arquivo faces-config.xml.

[quote=Naruto]sera que é por causa do facelets??
[/quote]

Fica tranquilo, o facelets funciona perfeitamente com PhaseListener. :wink:

meu web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <context-param> <param-name>org.richfaces.CONTROL_SKINNING</param-name> <param-value>enable</param-value> </context-param> <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <session-config> <session-timeout>3</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

meu faces-fonfig

[code]<?xml version='1.0' encoding='UTF-8'?>




autenticacao.AuthenticationPhaseListenerEmpresa



com.sun.facelets.FaceletViewHandler


EmpresaManagedBean
apresentacao.managedbean.EmpresaManagedBean
session


ContatoManagedBean
apresentacao.managedbean.ContatoManagedBean
session



home
/home.xhtml




loginAdministrador
/loginAdministrador/loginAdministrador.xhtml




loginEmpresa
/loginEmpresa/loginEmpresa.xhtml



/empresa/cadastroEmpresa.xhtml

#{EmpresaManagedBean.inserir}
sucesso
/empresa/cadastroEmpresaSucesso.xhtml



/empresa/cadastroEmpresa.xhtml

#{EmpresaManagedBean.inserir}
falha
/empresa/cadastroEmpresa.xhtml



/contato/cadastroContato.xhtml

#{ContatoManagedBean.inserir}
sucesso
/contato/cadastroContatoSucesso.xhtml



/contato/cadastroContato.xhtml

#{ContatoManagedBean.inserir}
falha
/contato/cadastroContato.xhtml



/home.xhtml

#{EmpresaManagedBean.montarPaginaCadastroEmpresa}
sucesso
/empresa/cadastroEmpresa.xhtml



/home.xhtml

#{ContatoManagedBean.montarPaginaCadastroContato}
sucesso
/contato/cadastroContato.xhtml



emailValidator
validacao.EmailValidator

[/code]

nossa to ficando doidaooo com isso parceiro
:smiley:

Certo, quais páginas não precisam ter um usuario autenticado para serem vistas?

Pelo que vi são 3: login.jsp, create.jsp e loginEmpresa.xhtml correto?

bom as pagina que podem ser vistas são a home… onde tem uma imagem explicando o sistema, a pagina de cadastro a pagina de login e a pagina de contato essas podem ser vistar sem autenticação…

private boolean requestingSecureView(FacesContext context) { ExternalContext extContext = context.getExternalContext(); String path = extContext.getRequestPathInfo(); return (!"/login.jsp".equals(path) && !"/create.jsp".equals(path)); }

o return aqui esta errado era para ser

return (!"/loginEmpresa/loginEmpresa.xhtml".equals(path) && !"/cadastro/cadastroEmpresa.xhtml".equals(path));

masi indenpendente disto ja estava dando erro

[quote=Naruto]private boolean requestingSecureView(FacesContext context) { ExternalContext extContext = context.getExternalContext(); String path = extContext.getRequestPathInfo(); return (!"/login.jsp".equals(path) && !"/create.jsp".equals(path)); }

o return aqui esta errado era para ser

return (!"/loginEmpresa/loginEmpresa.xhtml".equals(path) && !"/cadastro/cadastroEmpresa.xhtml".equals(path));

masi indenpendente disto ja estava dando erro [/quote]

Use a extensão do JSF que você configurou ( *.jsf), tente algo assim:

return (!"loginEmpresa.jsf".equals(path) && !"cadastroEmpresa.jsf".equals(path));

obrigado assim que chegar em casa tentarei isso
ai posto o resultado
vlw

Boa tarde, Rodrigo, alterei onde vc disse e ficou assim

private boolean requestingSecureView(FacesContext context) { ExternalContext extContext = context.getExternalContext(); String path = extContext.getRequestPathInfo(); return (!"/loginEmpresa/loginEmpresa.jsf".equals(path) && !"/empresa/CadastroEmpresa.jsf".equals(path)); }
porem quando eu executo a aplicação ainda continua mostrando uma pagina em branco e não abre o meu home.jsf
o Paulo sugeriu que eu tirasse o context.responseComplete(); so que se eu faço isso ele me redireciona direto para a pagina de login e não me deixa sair dela… e o que eu quero é que quando abrir aplicação ele mostreu meu home.jsf e nele possa clicar no menu login.jsf e ai sim.

meu web.xml o welcome file é o index.jsp e nesse index tem um jsp:forward que leva para meu home.jsf sera que tem algo a ver?

vlwwwww

nossa oq ue estou fazendo de errado sera? tudo que eu precisava era ser redirecionado para meu home e a partir dele acessar uma pagina de login e me logar rsrs

mais ninguem passou por isso?

Boa noite, consegui resolver sim , mais para isso mudei alguma coisas, pois como eu estava utilizando facelets precisei fazer assim

[code]package autenticacao;

import apresentacao.managedbean.AdministradorManagedBean;
import apresentacao.managedbean.EmpresaManagedBean;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

/**
*

  • @author blueyou
    */
    public class ListenerAutenticacao implements PhaseListener
    {
    private static final String USER_LOGIN_OUTCOME = “home”; //Indica a página para qual deve redirecionar

    @Override
    public void afterPhase(PhaseEvent event)
    {
    FacesContext context = FacesContext.getCurrentInstance();
    if ((usuarioEmpresa(context)) || (usuarioAdministrador(context))) {
    // allow processing of the requested view
    return;
    } else {
    // send the user to the login view
    if (requestingSecureView(context)) {
    FacesContext faces = FacesContext.getCurrentInstance();
    faces.getApplication().getNavigationHandler().handleNavigation(faces,
    null,
    USER_LOGIN_OUTCOME);
    }
    }
    }

    /**

    • Verifica se o usuario foi autenticado no contexto da sessao

    */
    private boolean usuarioEmpresa(FacesContext context) {
    ExternalContext extContext = context.getExternalContext();
    return (extContext.getSessionMap().containsKey(EmpresaManagedBean.USER_SESSION_KEY));
    }

    private boolean usuarioAdministrador(FacesContext context) {
    ExternalContext extContext = context.getExternalContext();
    return (extContext.getSessionMap().containsKey(AdministradorManagedBean.USER_SESSION_KEY));
    }

    /**

    • Determina se a página requisitada é uma de login, e nesse

    • caso deixa o fluxo seguir sem autenticar.

    */
    private boolean requestingSecureView(FacesContext context) {
    ExternalContext extContext = context.getExternalContext();
    String path = extContext.getRequestServletPath();
    boolean resultado = (!"/home.jsf".equals(path) && !"/loginEmpresa.jsf".equals(path) && !"/empresaGeral/cadastroEmpresa.jsf".equals(path) && !"/empresaGeral/cadastroEmpresaSucesso.jsf".equals(path) && !"/loginAdministrador.jsf".equals(path) && !"/contato/cadastroContato.jsf".equals(path) && !"/contato/cadastroContatoSucesso.jsf".equals(path) && !"/empresa/exibirProduto.jsf".equals(path));
    return resultado;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
    }
    }
    [/code]
    o resto fiz da mesma forma

flwwwww