[JSF] Acesso direto a JSPs

11 respostas
F

Pessoal;
Bom dia!

Tenho em meu projeto a JSP “index.jsp” que possui um login de acesso. O usuário estando autenticado é redirecionado para a página “welcome.jsp”. Até aí tudo belezinha, mas acontece que se o usuário digitar diretamente o endereço da welcome.jsp ele entra da mesma forma, sem passar pelo login (index.jsp).

Andei lendo a respeito, estudando um pouco sobre o assunto e como travei, resolvi solicitar ajuda aos colegas.

De acordo com alguns artigos que li, coloquei no meu web.xml:

<web-resource-collection>
            <web-resource-name>Acesso restrito</web-resource-name>
            <!-- Add url-pattern for EACH raw JSP page -->
            <url-pattern>/welcome.jsp</url-pattern>
            <url-pattern>/insertVenda.jsp</url-pattern>
            <url-pattern>/sucesso.jsp</url-pattern>
            <url-pattern>/erroInsert.jsp</url-pattern>
            <url-pattern>/erroLogin.jsp</url-pattern>
            </web-resource-collection>
        <auth-constraint>
            <description>Sem regras, Apenas bloqueio  acesso direto</description>
        </auth-constraint>
        </security-constraint>

Acontece que mesmo assim o acesso direto é permitido, poderiam me orientar dizendo se tem mais algum procedimento a ser adotado?

Antecipadamente agradeço;

Tenham um excelente dia!

Marco A.

11 Respostas

CintiaDR

Nós aqui conseguimos “redirecionar pro login” usando o PhaseListener. Fazemos daí o teste se está logado ou não…

Bravox

Para resolver esse problema vc pode utilizar filtros que verificam se o usuário está logado antes de responder a requisição , é um método simples e eficaz , para isso basta vc criar uma classe que implementa a interface javax.servlet.Filter ( o método doFilter() já resolve ) , ai vai um exemplo de filtro que uso para usuários administradores:

public class FilterAdm implements Filter{
	
	
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {

		HttpServletRequest request = (HttpServletRequest) req;
		
		HttpSession session = request.getSession();
		
		// recupera o usuario adm logado da sessão  
		Login login = (Login) session.getAttribute("adm");
		
		RequestDispatcher dispatcher = null;
		
		//  tem usuario administrator ?
		if( login == null ){
			
			// não , então envia para a pagina de acesso invalido
			dispatcher = req.getRequestDispatcher("/security/acessoInvalido.jsf");				
		}
		else {
			
			// sim , então libera o acesso a pagina 
			dispatcher = req.getRequestDispatcher( 
					StringUtils.removeStart( request.getRequestURI() , "/app" ) );
		}
				
		dispatcher.forward(req, resp);
	}

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

e no web.xml basta add :

<filter>
    	<filter-name>filterAdm</filter-name>
    	<filter-class>nome qualificado da clase ( pacote + classe )</filter-class>
    </filter>


    <filter-mapping>
    	<filter-name>filterAdm</filter-name>
    	<url-pattern>/pages/adm/*</url-pattern> <!-- e filtrado todas as requisiçoes com essa url -->
    </filter-mapping>
F

Obrigado pelas dicas!

Gostaria de mais uma vez poder contar com o auxílio de vocês. Estou gatinhando, não tenho ainda muito conhecimento em java, mas vou em frente!

Sobre o PhaseListener, não consegui entender o procedimento, se puderem me dar um exemplo agradeceria.

Agora sobre o Filter, até fui ais “longe”. Criei a classe conforme orientado:]

package util;

import java.io.IOException;   
import javax.servlet.Filter;   
import javax.servlet.FilterChain;   
import javax.servlet.FilterConfig;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.RequestDispatcher;   
import javax.servlet.ServletException;   
import javax.servlet.ServletRequest;   
import javax.servlet.ServletResponse;   
import javax.servlet.http.HttpSession;
  
public class SessionExpiredFilter implements Filter {   
private String page = "/erroLogin.jsp";   
  
public void destroy() {   
}   
  
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {   
        HttpServletRequest request = (HttpServletRequest) req;   
        HttpSession session = request.getSession();   
           
        // recupera o usuario adm logado da sessão     
        Object login = session.getAttribute("usuCod");
        RequestDispatcher dispatcher = null;   
           
        //  tem usuario administrator ?   
        if( login == null ){   
            //então envia para a pagina de acesso invalido   
            dispatcher = req.getRequestDispatcher("/");                 
        }   
        else {   
            // libera o acesso a pagina   
            dispatcher = req.getRequestDispatcher(( request.getRequestURI()) );   
        }   
                   
        dispatcher.forward(req, resp);   
    }   

  
public void init(FilterConfig filterConfig) throws ServletException {   
    if(filterConfig.getInitParameter("page") != null) {   
        page = filterConfig.getInitParameter("page");   
    }   
}   
}

Como atribuir o valor ao “usuCod” para que esta classe faça a verificação. No meu caso o “usuCod” é está em um bean que valorizo quando checado no banco.

Obrigado pessoal!

Marco A

Bravox

Acredito que na hora de o usuário se logar no seu sistema, ira gerar um evento que será processado por um MB ( fazendo um pesquisa no banco ou coisa do gênero ) , enfim de alguma forma vc vai verificar se o usuário existe, e se ele existe vc coloca ele na sessão da sua aplicação , com isso na hora que for passar pelo filtro o usuário vai estar na sessão. E para recuperar a sessão e add um objeto nela para que vc possa recuperar em seu filtro vc pode fazer da seguinte forma :

HttpSession session = 
      (HttpSession) FacesContext.getCurrentInstance()
		.getExternalContext().getSession(false);

session.setAttribute("usuCod",  seu objeto );

com isso o seu objeto está disponível em toda sessão

F

Olá Bravox e colegas do GUJ!
Bom Dia!

Se puderem me ajudar outra vez, agradeço.
Fiz da seguinte maneira:

Na minha classe que verifica o usuário, via SQL no banco, coloquei como me orientou:

...
	while (rs.next()){
                    url_="loginOK";
                    HttpSession session =(HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);   
                     session.setAttribute("usuCod",  "OK" ); 
...	}

A minha classe FilterLogin está assim:

package util;

import java.io.IOException;   
import javax.servlet.Filter;   
import javax.servlet.FilterChain;   
import javax.servlet.FilterConfig;   
import javax.servlet.http.HttpServletRequest;   
import javax.servlet.RequestDispatcher;   
import javax.servlet.ServletException;   
import javax.servlet.ServletRequest;   
import javax.servlet.ServletResponse;   
import javax.servlet.http.HttpSession;
  
public class FilterLogin implements Filter {   
  
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {   
        HttpServletRequest request = (HttpServletRequest) req;   
        HttpSession session = request.getSession();   
           
        // recupera o usuario adm logado da sessão     
        Object login = session.getAttribute("usuCod");
        RequestDispatcher dispatcher = null;   
           
        //  tem usuario administrator ?   
        if( login == null ){   
            //então envia para a pagina de acesso invalido   
            dispatcher = req.getRequestDispatcher("/erroLogin.jsp");                 
        }   
        else {   
            // libera o acesso a pagina   
            dispatcher = req.getRequestDispatcher(request.getRequestURI());   
        }   
                   
        dispatcher.forward(req, resp);   
    }   

  
    public void init(FilterConfig arg0) throws ServletException {   
    }    
    
    public void destroy() {   
    }   
}

o meu web xml:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.5" 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_2_5.xsd"&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;com.sun.faces.verifyObjects&lt;/param-name&gt;
        &lt;param-value&gt;false&lt;/param-value&gt;
    &lt;/context-param&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;com.sun.faces.validateXml&lt;/param-name&gt;
        &lt;param-value&gt;true&lt;/param-value&gt;
    &lt;/context-param&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
        &lt;param-value&gt;client&lt;/param-value&gt;
    &lt;/context-param&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;session-config&gt;
        &lt;session-timeout&gt;
            30
        &lt;/session-timeout&gt;
    &lt;/session-config&gt;
    &lt;welcome-file-list&gt;
        &lt;welcome-file&gt;faces/index.jsp&lt;/welcome-file&gt;
    &lt;/welcome-file-list&gt;
    
    &lt;filter&gt;   
        &lt;filter-name&gt;FilterLogin&lt;/filter-name&gt;   
        &lt;filter-class&gt;util.FilterLogin&lt;/filter-class&gt;   
    &lt;/filter&gt;   
   
    &lt;filter-mapping&gt;   
        &lt;filter-name&gt;FilterLogin&lt;/filter-name&gt;   
        &lt;url-pattern&gt;/Pharma/faces/*&lt;/url-pattern&gt; &lt;!-- e filtrado todas as requisiçoes com essa url --&gt;   
    &lt;/filter-mapping&gt;  
&lt;/web-app&gt;

Acontece que ao executar, não está entrando no filter. Pude notar que no web.xml tem a tag <url-pattern> dependendo do que eu coloco alí a página nem é exibida, dá o erro do tamcat:

type Status report
message /Pharma/Pharma/
description The requested resource (/Pharma/Pharma/) is not available.

Pode me ajudar?

Obrigado!
Tenham uma excelente semana!

Marco A.

Bravox

No web xml faz assim :

<filter-mapping>     
        <filter-name>FilterLogin</filter-name>     
        <url-pattern>/faces/*</url-pattern>
   </filter-mapping>

e no seu filtre :

else {  
               
   dispatcher = req.getRequestDispatcher(   
                 StringUtils.removeStart( request.getRequestURI() , "/Pharma" ) );  
}

e adiciona no path da aplicação a seguinte biblioteca commons lang

F

Bravox;

Creio que seja a última pergunta:

Alterei conforme me orientou acontece que a função “StringUtils” não tenho no meu NB, ee até sugere que eu import da classe: com.sun.xml.internal.ws.util.StringUtils mas se eu assim fizer dá erro dizendo que o método removeStart não existe. De qual pacote devo importar?

Outra pergunta: Baixei a Commons Lang, fui no NetBeans e adicionei os JARS que estavam compactados, é só isso mesmo?

Mais uma vez agradeço sua atenção e apoio!

Abraço

Marco Aurélio

Bravox

fanama:
Bravox;

Creio que seja a última pergunta:

Relaxa precisando estamos ai !

fanama:
Bravox;

Alterei conforme me orientou acontece que a função “StringUtils” não tenho no meu NB, ee até sugere que eu import da classe: com.sun.xml.internal.ws.util.StringUtils mas se eu assim fizer dá erro dizendo que o método removeStart não existe. De qual pacote devo importar?

Outra pergunta: Baixei a Commons Lang, fui no NetBeans e adicionei os JARS que estavam compactados, é só isso mesmo?

Então , A classe StringUtils é uma classe da biblioteca commons lang , se ele não aparece e por que ela não está no path da su app , vc precisa somente adicionar um jar no path , esse jar está nomeado + ou - assim commons-lang-2.3.jar , com isso vc já tem a classe disponível para usar

P.S: Eu uso eclipse então não sei te informar direito como add um jar no path da sua aplicação !

F

Bravox;
Boa Tarde!

Com a sua ajuda estou quase lá!

Funcionou certinho, até demais… rsrsrsrs

O filter está passando pela minha página inicial (index.jsp) aí como o objeto “usuCod” é vazio ele dá um redirect para a pagina de erro…rsrsrs
Aí não tem como eu me legar na página!

Como tratar isso, ou seja, funcionar o filtro para todas as páginas, exceto para a pagina inicial (index.jsp) ?

Mais uma vez agradeço!

Marco A.

Bravox

Coloca a index.jsp na raiz do projeto ou seja no mesmo diretório que está o diretório WEB-INF, fica + ou - assim:

seuprojeto 
     |______ index.jsp
     |    
     |______ WEB-INF
                 |
                 |_____ class .. etc ..

e no web.xml basta colocar :

<welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

Com isso a index não passa pelo o filtro ( e realmente não há necessidade sendo que o usuário precisa se logar )

A

Bravox ou quem puder,

Cara e se eu quiser fazer com perfil de acesso? Tipo, usuario Admin pode navegar nas paginas X, usuário tipo Cliente pode navegar nas páginas Y? Como proceder?

Obrigado,

Alexandre

Criado 13 de março de 2008
Ultima resposta 5 de nov. de 2008
Respostas 11
Participantes 4