Filter Servlet

Dae galera… estou com um problema no meu Filtro…
Quando eu tento acessar um link dessa maneira pra ver se o meu filtro esta certo

http://localhost:8080/SGD/ServDocumentoController?command=incluirDocumento&tipoOperacao=add ele tenta redirecionar para a pagina de login, mas nunca a encontra, hoje ela esta assim:

String url = "jsp/frmLogin.jsp";

Dae quando eu coloquei o nome do contexto, funcionou em partes

String url = "SGD/jsp/frmLogin.jsp";porque em partes, porque ele carrega a pagina sem os seus css, vem só o html…
esse é um dos problemas, o outro é que ao entrar nessa pagina de login que ele acabou de me redirecionar porque eu tentei acessar uma pagina sem me logar, ele ao dar o submit vai para o endereço errado… tipo… o endereço certo era isso:
http://localhost:8080/SGD/ServDocumentoController?command=incluirDocumento&tipoOperacao=add ele tenta redirecionar para a
Dae ele adiciona um /jsp
http://localhost:8080/SGD/jsp/ServDocumentoController?command=incluirDocumento&tipoOperacao=add ele tenta redirecionar para
a
Muito estranho tudo isso…
Quando eu tento acessar uma pagina jsp diretamente ele aceita, ele só bloqueia caso eu tente passar o link com o nome do meu servlet…
Segue a estrutura do projeto(NetBeans):

[code]SGD

  • Páginas Web
    • WEB-INF
    • jsp
      • Todos os jsp’s…
        …[/code]
        Meu jsp de login e seu action
<form id="frmLogin" name="frmLogin" method="post" action="ServLogon">

Meu web.xml

<filter> <filter-name>SecurityFilter</filter-name> <filter-class>br.gov.sc.alesc.sgd.controller.SecurityFilter</filter-class> </filter> <filter-mapping> <filter-name>SecurityFilter</filter-name> <url-pattern>/ServDocumentoController/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SecurityFilter</filter-name> <url-pattern>/ServEntidadeController/*</url-pattern> </filter-mapping>

E o meu filtro

[code]public class SecurityFilter implements Filter {

public void init(FilterConfig filterConfig) throws ServletException {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    boolean isValid = false;
    try {
        isValid = verifyAccess((HttpServletRequest) request);
    } catch (Exception e) {
        throw new ServletException(e.getMessage());
    }
    if (!isValid) {            
        String url = "jsp/frmLogin.jsp";
        ((HttpServletResponse) response).sendRedirect(url);
        ((HttpServletResponse)response).getWriter().flush();
        ((HttpServletResponse)response).getWriter().close();
        return; 
    }
    chain.doFilter(request, response);
    
}

public void destroy() {
}

protected boolean verifyAccess(HttpServletRequest request) throws Exception{
    
    UsuarioVO usuario = ( UsuarioVO ) request.getSession().getAttribute("user");
    boolean isInvalidSistema = false;
    if( usuario!= null)
        isInvalidSistema = true;
    
    return isInvalidSistema;
}

}[/code]
No meu web.xml eu não coloquei o /* desse jeito, porque ele ficava passando pelo meu Servlet de login, dae eu nunca conseguia passar por ele, a alternativa que encontrei foi definir todos os urls que o meu filtro tem de passar… é a primeira vez que uso esse filtro, se alguém tiver outra ideia de implementação ou dicas será bem vindo…

Valeu!!

O problema é que seus commands e suas JSPs estão em niveis de estrutura diferentes, em niveis de pasta, mas especificamente.
Lembre-se que, quando a renderização da página é executada ela leva em consideração a localização do servlet, com isso o contexto /Contexto/Servlet?command=X é diferente de /Contexto/jsp/pagina.jsp…
Tente criar um command fixo para redirecionamentos, com isso vc teria a sua página como as outras e faria a chamada do Filter da mesma maneira, direcionando para um command.

Cara… eu fiz assim agora…

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { boolean isValid = false; try { isValid = verifyAccess((HttpServletRequest) request); } catch (Exception e) { throw new ServletException(e.getMessage()); } if (!isValid) { //request.setAttribute("url_login", getNextURL(( HttpServletRequest)request)); String url = ((HttpServletRequest)request).getContextPath()+"/jsp/frmLogin.jsp"; filterConfig.getServletContext().getRequestDispatcher("/ServDocumentoController?command=login").forward(request,response); //((HttpServletResponse) response).sendRedirect("ServDocumentoController?command=login"); ((HttpServletResponse)response).getWriter().flush(); ((HttpServletResponse)response).getWriter().close(); return; } chain.doFilter(request, response); }
Alterei o Filter e criei um command para chamar o meu login… dae esse command está assim:

[code]public class ViewLoginCommand extends CommandUtil implements ALWebCommand {

public void doAction(HttpServletRequest request, HttpServletResponse response, ServletContext context) throws ServletException {                
    try {            
        RequestDispatcher disptcher = context.getRequestDispatcher("/jsp/frmLogin.jsp");
        disptcher.forward(request, response);
        
    } catch (Exception e) {
        throw new ServletException(e.getMessage());
    }
}

}[/code]
Agora ele funciona para qualquer requisição feita com a chamada http://localhost:8080/SGD/ServDocumentoController?command=incluirDocumento&tipoOperacao=add

Mas quando eu chamo o jsp diretamente ele chama o jsp mas sem os css e quando dou um submit acontece dele adicionar o /jsp de novo… aff…

O meu web.xml adicionei

<filter-mapping> <filter-name>SecurityFilter</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>

Valeu!!

Cara,
Sua aplicação é centrada em servlets, correto?!?
Então TODAS as suas chamadas devem utilizar um servlet, mesmo que seja um simples redirect para um JSP “estatico”…
Não utilize a chamada direta pelo JSP por segurança e até mesmo por boas maneiras.
Utilize sempre um servlet.
E não adianta vc refazer os caminhos do CSS na sua aplicação para a sua chamada ao JSP mfun cionar corretamente porque o caminho delas e do seu servlet estão em niveis diferentes, não adianta…
Esqueça a chamada direta à página.

Cara…isso eu entendí… acho que vc não entendeu… vamos supor que um usuário queira tentar dar uma burlada no meu sistema… e ele queira acessar assim o meu sistema
localhost:8080/SGD/jsp/frmPrincipal.jsp, ele vai conseguir…
Todo o meu sistema esta baseado em Servlets… não tem chamadas jsp’s diretamente… o que eu quero evitar é o cara acessar um link dessa maneira e conseguir ver a pagina…, quando eu falo das chamadas, estou falando de pegar esse link e colar na URL pra tentar acessar aquele recurso…, dae se eu pegar o link localhost:8080/SGD/jsp/frmPrincipal.jsp ele vai conseguir acessar o meu jsp, se ele tentar colar essa esse link no browser localhost:8080/SGD/ServDocumentoController?command=pesquisaDocumento, ele faz certo e redireciona para a tela de login…
Abraço!!

Bom dia Colegas,

  Espero contar com a ajuda de vocês.

  Trabalho com o Netbeans 6.5, Glassfish como servidor e MySQL ; sou iniciante em Java.
  Preciso criar um filtro em minha aplicação web, que faça a autenticação e autorização de usuários.

  Exemplificando, em minha aplicação eu teria as seguintes páginas:  Login.jsp, Welcome.jsp, CadastroCidades.jsp, CadastroUF.jsp e CadastroPaises.jsp
                                                                                      Usuários: Joao, Pedro e Administrador


  O João terá acesso apenas a CadastroCidades.jsp
  Pedro terá acesso a CadastroUF.jsp e CadastroPaises.jsp, mas [u]não acessará[/u] de forma alguma a página CadastroCidades.jsp
  O usuário Administrador acessará todas as páginas do aplicativo.

   Já me disseram para usar parametros em filtros, já me disseram para usar PhaseListener. Mas infelizmente não estou conseguindo sair do lugar.

   Por favor, algum de vocês poderia me ensinar a como fazer esse filtro nos moldes que citei logo acima ??

Forte Abraço

http://www.guj.com.br/articles/11

esse artigo ajuda a aprender sobre filtros… porém nele há um pequeno erro pelo que notei

o metodo destroy() está assim:

public void destroy() {
config = null;
}

e o correto seria:

public void destroy() {
context = null;
}

[quote=leo_lvieira]http://www.guj.com.br/articles/11

esse artigo ajuda a aprender sobre filtros… porém nele há um pequeno erro pelo que notei

o metodo destroy() está assim:

public void destroy() {
config = null;
}

e o correto seria:

public void destroy() {
context = null;
}
[/quote]

Valeu pela colaboração Leo.

Abs

cara… tá tenso

to querendo fazer uma autenticação simples, eis meu filter:

[code]public class TreinamentoFilter implements Filter{

public void destroy() {
	
}	

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {		

	HttpServletResponse res = (HttpServletResponse) response;
	HttpServletRequest req = (HttpServletRequest) request;
	HttpSession session = req.getSession();	


	if (session.getAttribute("logado") != null) {
		System.out.println("Logado "+session.getAttribute("logado"));	
		chain.doFilter(request, response);		
	}else{
		System.out.println("Não logado");	
		res.sendRedirect("/treinamento/treinamento/geral/login.jsp");

	}

}


public void init(FilterConfig fConfig) throws ServletException {

}

}[/code]

quando executo o projeto da o erro no browser:

Esta página da web tem um loop de redirecionamento

o meu web.xml:

<filter-mapping> <filter-name>TreinamentoFilter</filter-name> <url-pattern>/treinamento/*</url-pattern> </filter-mapping>

mudei meu redirecionamento para:

	req.getRequestDispatcher("/treinamento/geral/login.jsp").forward(request, response);

aí minha página de login carregou, mas sem CSS, e quando acesso o sistema por um link sem fazer login o filter permite

http://localhost:8080/treinamento/AlunoServlet?acao=listar

quando eu acesso o link q me da acesso ao sistema mesmo sem estar logado a tela carrega normalmente, mas quando eu atualizo (F5), não carrega nenhum CSS na JSP.

parece q funcionou, mudei meu mapeamento no web.xml para o servlet:

<filter-mapping> <filter-name>TreinamentoFilter</filter-name> <url-pattern>/AlunoServlet</url-pattern> </filter-mapping>

e deu certo : )

[quote=fabiomariner]parece q funcionou, mudei meu mapeamento no web.xml para o servlet:

<filter-mapping> <filter-name>TreinamentoFilter</filter-name> <url-pattern>/AlunoServlet</url-pattern> </filter-mapping>

e deu certo : )[/quote]

Ok Fabio, obrigado por colaborar.

Abraços e fique na paz!

[quote]Ok Fabio, obrigado por colaborar.

Abraços e fique na paz![/quote]
eu é que agradeço por ter usado seu tópico, abraço