Problema com session e acesso a arquivos em jsp [RESOLVIDO]

20 respostas
jpcasati

Olá,

Estou com um probleminha aqui, espero que alguém possa me ajudar.

Tenho um sistema onde o usuários e loga, e cria uma sessão com o objeto usuário.

Ele lista uns arquivos, se validado, e pode baixá-los.

Só tenho um problema, pessoas não-logadas estão conseguindo baixar os arquivos pelo link direto.

Gostaria de saber como poderia bloquear o acesso a arquivos de uma determinada pasta e suas subpastas para quem tivesse logado apenas.

Obrigado.

20 Respostas

KWill

jpcasati:
Olá,

Estou com um probleminha aqui, espero que alguém possa me ajudar.

Tenho um sistema onde o usuários e loga, e cria uma sessão com o objeto usuário.

Ele lista uns arquivos, se validado, e pode baixá-los.

Só tenho um problema, pessoas não-logadas estão conseguindo baixar os arquivos pelo link direto.

Gostaria de saber como poderia bloquear o acesso a arquivos de uma determinada pasta e suas subpastas para quem tivesse logado apenas.

Obrigado.


Tá usando o que? Tomcat? Jetty? nanohttpd?

Inté.

jpcasati

Tomcat

vinicius.martinez

Cara,

Existem várias maneiras de voce fazer isso, mas a mais fácil e mais utilizada é a utilizando “Filtros”

http://javafree.uol.com.br/topic-4654-Utilizacao-de-Servlet-Filters.html

leandronsp

Esse link está chamando alguma Servlet ou Lógica certo?

Na lógica que devolve o arquivo como resposta, vc está fazendo a verificação se o usuario está na sessão? Uma verificação poderia resolver seu problema…

steniobh

Vc usa um bean para disponibilizar o arquivo?
Vc esta usando jsf?
Vc faz algum tipo de controle de sessão?

Eu pessoalmente tenho um bean de controle e quando o usuário está acessando determinada pagina eu apenas verifico a validade da sessão e suas permissões.

Qualquer coisa estamos aew!!

jpcasati

não estou usando jsf, só servlet e jsp.
To usando controle de sessão normal, q eu mesmo criei. Mas vamos supor, o kra vai la e faz o upload. o arquivo ta na pasta upload/arquivo.pdf

se o kra digita www.site.com.br/upload/arquivo.pdf no browser ele baixa. ver o link n da, mas ele acessa diretamente o arquivo, queria impedir que ele acessasse qualquer conteudo dentro dessa pasta upload apenas se tivesse com a sessão aberta.

valew!

vinicius.martinez

Cara,…

Use filtros…

Servlet FIlter…

Te mandei um tuto bacana…ai é so adequar a suas necessidades

sandro.csimas

É isso ai cara, usando filtros vc consegue resolver esse problema.
Vc pode testar se uma variavel na sessao que identifica o usuario logado está nula, se estiver entao o usuario é redirecionado pra tela de login.

jpcasati

Galera, fiz usando filtros, só que:

  • quando não está logado, funciona corretamente, redireciona pra página q eu escolhi.

  • quando está logado ele entra, só que na hora de exibir o arquivo, só aparece uma página em branco…

leandronsp

Deu algum erro nos logs?

Tela branca tem fama de NullPointerException…nem sempre, mas geralmente, é isso que ocorre. Tem como postar seu codigo e o possivel log?

jpcasati

Logs tem uns de erro de não encontrar a classe de filtro mas depopis eu resolvi e não tem mais nada…

Meu código:

Classe Filtro:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;

      HttpSession session = req.getSession();
      String user = (String) session.getAttribute("disc");
      String user2 = (String) session.getAttribute("prof");
      String user3 = (String) session.getAttribute("admin");
      if((user!=null && user.equals("on"))||(user2!=null && user2.equals("on"))||(user3!=null && user3.equals("on"))){
         return;
      }
      res.sendRedirect("/Disciplinas/index.jsp");
   }

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

O Web.xml

<filter>
        <filter-name>validator</filter-name>
        <filter-class>Filtro</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>validator</filter-name>
   <url-pattern>/upload/*</url-pattern>
    </filter-mapping>

O estranho é que quando eu não estou logado, ele re4direciona rpa página index.jsp certinho, mas quando estou, na hora de exibir o arquivo, vem uma tela em brancop, com a url do arquivo no browser…

leandronsp

Pelo que me parece, seu filtro verifica se o usuario está “on”. Se ele entra no if, retorna para a página que está chamando. Esta é a página do arquivo?

Tenta trocar por algo assim:

chain.doFilter(request, response);
if((user!=null && user.equals("on"))||(user2!=null && user2.equals("on"))||(user3!=null && user3.equals("on"))){  
      // redireciona para a página da requisição
      res.sendRedirect(req.getRequestURI());  
} else {
      res.sendRedirect("/Disciplinas/index.jsp"); 
}
jpcasati

às vezes funciona e às vezes não este código que você me passou, tipo, a primeira vez q eu tento acessar ele retorna à página mas depois ele vai pro arquivo normalmente.

jpcasati

Dá esse log:

26/02/2010 16:12:31 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
        at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
        at Filtro.doFilter(Filtro.java:33)        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
jpcasati

Agora o filtro esta funcionando perfeitamente, oque nao funciona é quando estou logado, ao chamar o arquivo, aparece isto na página:

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

java.lang.IllegalStateException
	org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
	Filtro.doFilter(Filtro.java:35)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.

Meu código esta:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;

      HttpSession session = req.getSession();
      String user = (String) session.getAttribute("disc");
      String user2 = (String) session.getAttribute("prof");
      String user3 = (String) session.getAttribute("admin");

      if((user!=null && user.equals("on"))||(user2!=null && user2.equals("on"))||(user3!=null && user3.equals("on"))){

          res.sendRedirect(req.getRequestURI());
         
      }
      res.sendRedirect("/Disciplinas/index.jsp");
   }
jpcasati

Descobri o erro, como consertar já não faço idéia. Acho que é o seguinte:

  • Chamo o arquivo, ele passa pelo filtro.

  • Se validado, ele chama o arquivo denovo

  • passa pelo filtro denovo

ele fica passando pelo filtro eternamente…

leandronsp

Mas ele vai passar pelo filtro a cada requisição. Coloca um “else” no seu bloco “if”

jpcasati

Não adianta, ele ainda fica em loop infinito, pois ele vai validar e chamar denovo a mesma url, e ai chama o filtro denovo, parece q dando um forward isso não acontece, como eu daria um forward? nao axei objeto q disparasse isso no meu metodo…

jpcasati

RESOLVIDO:
(o negócio foi dar um forward mesmo, ao invés de sendRedirect.)

Filtro.java

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class Filtro implements Filter{

   public void destroy() {
   }

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain filter) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      HttpServletResponse res = (HttpServletResponse) response;

      HttpSession session = req.getSession();
      String user = (String) session.getAttribute("disc");
      String user2 = (String) session.getAttribute("prof");
      String user3 = (String) session.getAttribute("admin");
      if((user!=null && user.trim().length()>0)||(user2!=null && user2.equals("on"))||(user3!=null && user3.equals("on"))){
          req.getRequestDispatcher(req.getRequestURI()).forward(request, response);
      } else {
      res.sendRedirect("/Disciplinas/index.jsp");
      return;
      }
   }

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

Bom dia Pessoal,
To com um problemão aqui no meu tcc.
Eu utilizo servlet + jsp no tomcat. Estou utilizando filtros para bloquear acesso a minha aplicação.
Até que está funcionando, todas as minhas *.jsp estão bloqueadas, porém há um caso em que eu preciso enviar um parametro para a jsp: RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp"); dispatcher.forward(request,response);
quando eu fasso esse envio ele consegue acessar a minha página, mesmo que o login do usuário não exista.

Analizando bem a minha url, ele não está acessando diretamente a minha jsp e sim o meu servlet

http://localhost:8090/testetcc/LoginUsuario

se eu acessar algum jsp, ele pede para o usuário logar.

Alguém sabe o que eu poderia fazer?
existe alguma forma de bloquear as servlets?

Muito Obrigado

Criado 22 de fevereiro de 2010
Ultima resposta 14 de nov. de 2010
Respostas 20
Participantes 7