Login aplicação JSF - [Resolvido]


Escolha o melhor para seu projeto…

Pessoal, não é possível q vcs que usam filter ou phaselistener, tenham conseguido fazer isso funcionar com as URLs atrasadas do JSF…
Ou ninguem percebeu isso, ou eu q ainda não tomei conhecimento de algum detalhe pra driblar essas URLs atrasadas…
e ai ?

[quote=cleiton herrmann]Pessoal, não é possível q vcs que usam filter ou phaselistener, tenham conseguido fazer isso funcionar com as URLs atrasadas do JSF…
Ou ninguem percebeu isso, ou eu q ainda não tomei conhecimento de algum detalhe pra driblar essas URLs atrasadas…
e ai ?[/quote]

É so colocar no filtro que vc filtrar os FORWARD pq internamente O JSF navega assim
Vc deve estar usando apenas REQUEST dai fura mesmo…

meu filter tava só assim<filter> <filter-name>LoginFiltro</filter-name> <filter-class>controle.FiltrarRestricoes</filter-class> </filter> <filter-mapping> <filter-name>LoginFiltro</filter-name> <url-pattern>*.xhtml</url-pattern> </filter-mapping>onde eu coloco essa tag ?

[quote=cleiton herrmann]meu filter tava só assim<filter> <filter-name>LoginFiltro</filter-name> <filter-class>controle.FiltrarRestricoes</filter-class> </filter> <filter-mapping> <filter-name>LoginFiltro</filter-name> <url-pattern>*.xhtml</url-pattern> </filter-mapping>[/quote]

Pois é…foi como eu falei…use assim:

<filter-mapping>  
    <filter-name>LoginFiltro</filter-name>  
    <url-pattern>*.xhtml</url-pattern>  
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>INCLUDE</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>

eu consegui fazer, mas de um jeito um pouco diferente dos que eu vi o pessoal comentando ai e nos tutoriais pela net

aqui q eu fiz diferente, eu seto um parametro com o nome da pagina q quero abrir<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin"> <f:param name="paginaRequisitada" value="enviarPromocoesCliente.xhtml"/> </h:commandLink>classe que implementa phaselistener, e aqui eu recupero o nome da pagina q eu quero abrir através daquele parametro que setei acima, já q a URL sempre esta atrasada…[code]public class AuthorizationListener implements PhaseListener {

@Override
public void afterPhase(PhaseEvent event) {
    FacesContext facesContext = event.getFacesContext();
    String paginaRequisitada = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("paginaRequisitada");
    
    boolean isRestrict = false;
    if (paginaRequisitada != null) {
        if (paginaRequisitada.equals("enviarPromocoesCliente.xhtml")) {
            isRestrict = true;
        }
    }
    
    Usuarios currentUser = (Usuarios) ((HttpSession) facesContext.getExternalContext().getSession(true)).getAttribute("usuarioLogado");

    if (isRestrict && currentUser == null) {
        System.out.println("entrou");
        NavigationHandler nh = event.getFacesContext().getApplication().getNavigationHandler();
        nh.handleNavigation(event.getFacesContext(), null, "loginPage");
    }
}

@Override
public void beforePhase(PhaseEvent event) {
}

@Override
public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
}

}[/code]faces-config.xml[code]

<lifecycle>
    <phase-listener>controle.AuthorizationListener</phase-listener>
</lifecycle>

<navigation-rule>
    <from-view-id>/*</from-view-id>
    <navigation-case>
        <from-outcome>loginPage</from-outcome>
        <to-view-id>/index.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

[/code]a parte diferente que fiz, foi setar um parametro “paginaRequisitada” no faces, quando clico no link para abrir a nova pagina, isso resolveu o problema da url atrasada, mas fiquei na duvida se é uma boa pratica, o que vcs me dizem ??

FernandoFranzini, vlw por todas as dicas ai, mas só de curioso eu volter a testar com filter, e mesmo colocando as tags como vc falou, não consegui fazer funcionar, as URLs sempre ficam atrasadas, sei lá, por enquanto vou ir levando desse jeito q falei acima.

gostaria se possível da opinião de vcs sobre o código e a questão se usar um parametro para saber a pagina q será aberta…

vlw t+

[quote=cleiton herrmann]FernandoFranzini, vlw por todas as dicas ai, mas só de curioso eu volter a testar com filter, e mesmo colocando as tags como vc falou, não consegui fazer funcionar, as URLs sempre ficam atrasadas, sei lá, por enquanto vou ir levando desse jeito q falei acima.

gostaria se possível da opinião de vcs sobre o código e a questão se usar um parametro para saber a pagina q será aberta…

vlw t+[/quote]

O JSF realmente muda as url no navegador depois q o usuario ja passou pela pagina…mas não sei oq isso tem haver…
Qual é o seu problema?

então FernandoFranzini, o problema é nessas linhas de código abaixo na hora de autorizar o acesso para o usuario

a minha situação é assim, pagina index.xhtml, pagina enviarpromocoescliente.xhtml, a index, qualquer pessoa poderá acessar, já a enviarpromocoescliente, só quem tiver um usuario autenticado na sessão, então vc esta na pagina index, já informou usuario e senha e fez o login, e clica para abrir a enviarpromocoescliente.

classe que implementa phaselistenerFacesContext facesContext = event.getFacesContext(); String currentPage = facesContext.getViewRoot().getViewId();o código acima nao me retorna …enviarpromocoescliente.xhtml ele retorna …index.xhtml, então toda a logica de autorização do acesso já era… por isso estou usando aquele parametro para setar a pagina que pretendo carregar quando clico em algum commandlink, só queria saber o q vcs acham desse parametro, se é uma boa pratica, prós e contras…

Realmente usar phaseListener funciona mas tem seu pros ai…eu prefiro usar Filter que é bem melhor…mas para resolver seu problema…para pegar a url atual, acesse via HttpRequest:

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); String currentPage = req.getRequestURI();
Veja se resolve…

então FernandoFranzini, abaixo esta o meu filter configurado no web.xml como vc falou<filter> <filter-name>LoginFiltro</filter-name> <filter-class>controle.FiltrarRestricoes</filter-class> </filter> <filter-mapping> <filter-name>LoginFiltro</filter-name> <url-pattern>*.xhtml</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>aqui a classe que implementa filter, só pra testar possui apenas o system.out, se eu fizer do jeito q vc falou[code]public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
String currentPage = req.getRequestURI();
System.out.println("currentPage: " + currentPage);

   chain.doFilter(request, response);        
}[/code]da erro, a linha 48 da stacktrace é referente a linha 2 do código acima[code]java.lang.NullPointerException
controle.FiltrarRestricoes.doFilter(FiltrarRestricoes.java:48)[/code]e se eu fizer assim[code]public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        
    HttpServletRequest req = (HttpServletRequest) request;
    String currentPage = req.getRequestURI();
    System.out.println("currentPage: " + currentPage);
    
    chain.doFilter(request, response);        
}[/code] veja a saida quando executo a aplicação e tento ir pra pagina enviarPromocoesCliente. a ultima linha do console deveria ser /SuperB/faces/enviarPromocoesCliente.xhtml, e se fosse td funcionaria perfeitamente[code]currentPage: /SuperB/

currentPage: /SuperB/faces/index.xhtml
currentPage: /SuperB/faces/index.xhtml[/code]

No caso do null vc fez mancada…dentro do filtro não tem FacesContext !!!
Dai vc pega na próprio parâmetro do métodos como vc fez na segunda vez…Agora de não chegar o URL tem algo errado…eu uso isso em vários projetos e sempre funcionou certinho…Existe algo de errado que vc não percebeu…
Na primeira vez, faz sentido ele mostrar a mesma pagina…pq antes de vc mudar de pagina vc dispara um action…para a mesma…depois q vc retorna String para a proxima navegação…
A não ser que o filtro não esteje sendo executado para a outra URL…como vc ta navegando? qual o endereço a outra? post o seu MDB e seu faces config…

pois é, realmente a minha falta de experiencia e conhecimento em web tah me fazendo sofrer, mas é assim: usando filter, nem tem o arquivo faces-config.xml no meu projeto, eu uso só o web.xml com a seguinte configuração[code]<?xml version="1.0" encoding="UTF-8"?>


LoginFiltro
controle.FiltrarRestricoes


LoginFiltro
.xhtml
REQUEST
FORWARD
INCLUDE
ERROR


PrimeFaces FileUpload Filter
org.primefaces.webapp.filter.FileUploadFilter


PrimeFaces FileUpload Filter
Faces Servlet


javax.faces.PROJECT_STAGE
Development


javax.faces.STATE_SAVING_METHOD
server


Faces Servlet
javax.faces.webapp.FacesServlet
1


Faces Servlet
/faces/



Resource Servlet
org.primefaces.resource.ResourceServlet


Resource Servlet
/primefaces_resource/*



30



faces/index.xhtml

[/code]dai a classe FiltrarRestricoes[code]public class FiltrarRestricoes implements Filter, Serializable {

@Override
public void init(FilterConfig filterConfig) throws ServletException { 
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {              
    HttpServletRequest req = (HttpServletRequest) request;
    String currentPage = req.getRequestURI();
    System.out.println("currentPage: " + currentPage);
    
    chain.doFilter(request, response);                       
}

@Override
public void destroy() {
}

}[/code]ela tem a mesma saida no console das URLs atrasadas que mencionei no post anterior, e a seguir o commandlink na index.xhtml que uso pra acessar a pagina enviarPromocoesCliente.xhtml<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin" />e agora usando phaselistener, eu tiro aquela configuração de filtro no web.xml e coloco o arquivo faces-config.xml configurado assim[code]<?xml version='1.0' encoding='UTF-8'?>

<lifecycle>
    <phase-listener>controle.AuthorizationListener</phase-listener>
</lifecycle>

<navigation-rule>
    <from-view-id>/*</from-view-id>
    <navigation-case>
        <from-outcome>loginPage</from-outcome>
        <to-view-id>/index.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

[/code]a seguir a classe que implementa phaselistener, lembrando que se eu tentar obter o endereço da url requisitada, ele estará atrasado também, ou seja, mesmo problema que venho enfrentando com o filter, mas o código abaixo esta pegando o valor do parametro que setei no commandlink[code]public class AuthorizationListener implements PhaseListener {

@Override
public void afterPhase(PhaseEvent event) {
    FacesContext facesContext = event.getFacesContext();
    String paginaRequisitada = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("paginaRequisitada");
    
    boolean isRestrict = false;
    if (paginaRequisitada != null) {
        if (paginaRequisitada.equals("enviarPromocoesCliente.xhtml")) {
            isRestrict = true;
        }
    }
    
    Usuarios currentUser = (Usuarios) ((HttpSession) facesContext.getExternalContext().getSession(true)).getAttribute("usuarioLogado");

    System.out.println((isRestrict ? "é restrita" : ("não é restrita" + (paginaRequisitada != null ? " é " + paginaRequisitada : ""))) 
            + " | usuario: " + (currentUser == null ? "null" : currentUser.getNome()));

    if (isRestrict && currentUser == null) {
        System.out.println("entrou");
        NavigationHandler nh = event.getFacesContext().getApplication().getNavigationHandler();
        nh.handleNavigation(event.getFacesContext(), null, "loginPage");
    }
}

@Override
public void beforePhase(PhaseEvent event) {
}

@Override
public PhaseId getPhaseId() {
    return PhaseId.RESTORE_VIEW;
}

}[/code]e abaixo o código do commandllink na index.xhtml<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin"> <f:param name="paginaRequisitada" value="enviarPromocoesCliente.xhtml"/> </h:commandLink>é isso q estou fazendo, tah faltando alguma configuração ? vlw pela ajuda ai t+

Vc não precisa do phase listener só o filtro ja faz tudo…ou faz com 1 ou com outro…Filter é o mais indicado

  1. Retire a declaração do phase listener do faces-config pode até estar atrapalhando.
  2. troca a URL do seu filter para
    <url-pattern>/*</url-pattern>
    E veja o q vai imprimir…
  3. Sua ação esta estranha…nunca vi isso meu !!

[quote]<h:commandLink action="./enviarPromocoesCliente.xhtml" value=“Admin”>
<f:param name=“paginaRequisitada” value=“enviarPromocoesCliente.xhtml”/>
</h:commandLink>
[/quote]Pra quer serve esse <f:param ???
Isso ai ta estranho…vc navega declarando via na handler ou direto…pode ser isso que ta te bugandooo

Faça assim:
Declare:

[quote]<navigation-rule>
<navigation-case>
<from-outcome>OutraPagina</from-outcome>
<to-view-id>/enviarPromocoesCliente.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
[/quote]
Na pagina faça
<h:commandLink action=“OutraPagina” value=“Admin”>

Outra coisa… vc não precisa usar <from-view-id>/*</from-view-id>
é so retirar isso que ja é de qualquer view…

Como vc pode ver…não é o filtro q não esta funcionando…é sua forma de navegar…
Isso ta funcionando??? affff

acho q vc não entendeu o q eu fiz FernandoFranzini , eu nao fiz td isso ao mesmo tempo, ou eu estava usando o filter ou o phaselistener, e esse f:param q vc disse q nunca viu, é forma q eu encontrei pra pegar a pagina que está sendo carregada, é isso q eu estou pedindo a opinião de vcs há uns 4 posts hahahaha, mas vamos lá, vou testar aqui denovo do jeito q vc sugeriu, e depois volto a postar certinho como eu programei e o resultado, tomara q funcione, kkkkk

Então…desculpa a confusão mas vc não precisa fazer isso…senão vai ter que passar isso em todos as navegações do seu sistema…absurdo…
O getURL do HttpServletRequest te da acesso dinâmico a esse valor…

é isso mesmo q fiquei encomodado, em todos os commandlinks ter q colocar o f:param com o nome da pagina q vai ser carregada

Então faça:

  1. o filtro logar as páginas mas interceptando tudo “/*” como eu falei
  2. Coloca a navegação do faceConfig com handler nomal
  3. Faça a navegação e veja o log…
    Só não vai dar certo se vc fizer algo errado…

blz, vamos ver se eu pulei alguma parte
arquivo web.xml[code]<?xml version="1.0" encoding="UTF-8"?>


LoginFiltro
controle.FiltrarRestricoes


LoginFiltro
/
REQUEST
FORWARD
INCLUDE
ERROR


PrimeFaces FileUpload Filter
org.primefaces.webapp.filter.FileUploadFilter


PrimeFaces FileUpload Filter
Faces Servlet


javax.faces.PROJECT_STAGE
Development


javax.faces.STATE_SAVING_METHOD
server


Faces Servlet
javax.faces.webapp.FacesServlet
1


Faces Servlet
/faces/



Resource Servlet
org.primefaces.resource.ResourceServlet


Resource Servlet
/primefaces_resource/*



30



faces/index.xhtml

[/code]arquivo faces-config.xml[code]<?xml version='1.0' encoding='UTF-8'?>

<navigation-rule> 
    <navigation-case> 
        <from-outcome>outrapagina</from-outcome> 
        <to-view-id>/enviarPromocoesCliente.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

[/code]classe FiltrarRestricoes que implementa filter[code]public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String currentPage = req.getRequestURI();
System.out.println("currentPage: " + currentPage);

    chain.doFilter(request, response);               
}[/code]commandlink na index.xhtml[code]<h:commandLink action="./enviarPromocoesCliente.xhtml" value="Admin" />[/code]e finalmente após executar o site, e clicar apenas uma vez para carregar a pagina enviarPromocoesCliente.xhtml, temos todos esses System.out ai embaixo, menos o que eu quero que é o da pagina enviarPromocoesCliente.xhtml hahaha mas nao sei qual foi a parte q eu pulei... cara valeu pela ajuda ai e pelas explicações até agora !!![code]currentPage: /SuperB/

currentPage: /SuperB/faces/javax.faces.resource/growl/assets/growl.css
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/theme.css
currentPage: /SuperB/faces/javax.faces.resource/jquery/jquery.js
currentPage: /SuperB/faces/javax.faces.resource/growl/growl.js
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.js
currentPage: /SuperB/faces/javax.faces.resource/core/core.js
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.css
currentPage: /SuperB/faces/javax.faces.resource/password/password.css
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.js
currentPage: /SuperB/faces/javax.faces.resource/button/button.js
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.css
currentPage: /SuperB/faces/javax.faces.resource/yui/utilities/utilities.js
currentPage: /SuperB/faces/javax.faces.resource/ajaxstatus/ajaxstatus.js
currentPage: /SuperB/faces/javax.faces.resource/password/password.js
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.css
currentPage: /SuperB/faces/javax.faces.resource/datagrid/datagrid.css
currentPage: /SuperB/faces/javax.faces.resource/panel/panel.js
currentPage: /SuperB/faces/javax.faces.resource/dialog/dialog.js
currentPage: /SuperB/faces/javax.faces.resource/wijmo/wijmo.js
currentPage: /SuperB/faces/javax.faces.resource/panel/panel.css
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.js
currentPage: /SuperB/faces/javax.faces.resource/wijmo/wijmo.css
currentPage: /SuperB/faces/javax.faces.resource/autocomplete/autocomplete.js
currentPage: /SuperB/estilos/estilos.css
currentPage: /SuperB/faces/javax.faces.resource/datagrid/datagrid.js
currentPage: /SuperB/faces/javax.faces.resource/jsf.js
currentPage: /SuperB/imagens/frenteSuperB.png
currentPage: /SuperB/imagens/carregando.gif
currentPage: /SuperB/imagens/logoSuperB.png
currentPage: /SuperB/faces/index.xhtml
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-default.png
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-bg_flat_75_ffffff_40x100.png
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-icons_222222_256x240.png
currentPage: /SuperB/faces/index.xhtml
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/theme.css
currentPage: /SuperB/faces/javax.faces.resource/growl/assets/growl.css
currentPage: /SuperB/faces/javax.faces.resource/jquery/jquery.js
currentPage: /SuperB/faces/javax.faces.resource/core/core.js
currentPage: /SuperB/faces/javax.faces.resource/growl/growl.js
currentPage: /SuperB/faces/javax.faces.resource/yui/utilities/utilities.js
currentPage: /SuperB/faces/javax.faces.resource/datatable/datatable.css
currentPage: /SuperB/faces/javax.faces.resource/fileupload/fileupload.css
currentPage: /SuperB/faces/javax.faces.resource/fileupload/fileupload.js
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.css
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.css
currentPage: /SuperB/faces/javax.faces.resource/paginator/paginator.js
currentPage: /SuperB/faces/javax.faces.resource/button/button.js
currentPage: /SuperB/faces/javax.faces.resource/jquery/ui/jquery-ui.js
currentPage: /SuperB/faces/javax.faces.resource/editor/editor.css
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.js
currentPage: /SuperB/faces/javax.faces.resource/datatable/datatable.js
currentPage: /SuperB/faces/javax.faces.resource/editor/editor.js
currentPage: /SuperB/faces/javax.faces.resource/jsf.js
currentPage: /SuperB/faces/estilos/estilos.css
currentPage: /SuperB/estilos/estilos.css
currentPage: /SuperB/faces/javax.faces.resource/forms/forms.css
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-default.png
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/sprite.png
currentPage: /SuperB/faces/javax.faces.resource/editor/images/toolbar.gif
currentPage: /SuperB/faces/javax.faces.resource/themes/sam/images/ui-bg_flat_75_ffffff_40x100.png
currentPage: /SuperB/faces/javax.faces.resource/editor/images/buttons.gif
currentPage: /SuperB/faces/javax.faces.resource/fileupload/uploadify.swf
currentPage: /SuperB/faces/javax.faces.resource/fileupload/uploadify.swf[/code]

Vc entro na pagina index…e clickou no command link…ele navegou para outra pagina e não apareceu no filtro que esta interceptando tudo?

Outra coisa troque o :
<h:commandLink action="./enviarPromocoesCliente.xhtml" value=“Admin” />
para
<h:commandLink action=“outrapagina” value=“Admin” />

Por que apareceu tudo menos a outra pagina? kkkkkk essa foi boa…só com vc mesmo…