[RESOLVIDO] Session diferente na mesma pagia/sistama ou pasta

To aqui com uma duvida meio sinistra

Se voce tem la [color=blue] localhost/pagina1 [/color] e [color=blue] localhost/pagina2 [/color]
quando muda da pagina 1 para pagina 2, as sessions são diferentes, pelo menos da maneira que eu faço a verificação funciona assim.

loggin

session.setAttribute("idSession", session.getId());

Verificação

if(session.getId().equals(session.getAttribute("idSession")){
//Logado
}else{
//Redirect sair/inicial.
}

Certo, agora teria como eu ter essa divisão que ja existe de um “sistema pra outro” dentro do tomcat, na mesma pasta tipo:
[color=blue]
localhost/sistemas/sistema1
localhost/sistemas/sistema2
localhost/sistemas/sistema3
[/color]
sem ter que criar direto no local host um para cada?
eu tentei do jeito que fiz acima, mas ele aceita a mesma session para as 3 pastas, diferente de colocar direto no localhost, que fica ja não passa essa verificação.

Você não pode contar com o id da sessão para verificar se é a mesma sessão.

Há muito tempo atrás, eu estudei o sistema de Sessions do Jetty e é assim: o mapeamento chave-valor, onde chave é JSESSIONID e valor é o objeto HttpSession, é escondido do usuário, não tem como acessá-lo da Servlet (se não me engano, quem gerencia é a classe SessionId); e os ids podem ser refeitos por n razões (exemplo: uma session que faz serialização em disco, onde, na desserialização, o id é recriado). Não sei no Tomcat, mas pode haver reatribuição de ids pelo container.

Agora, o seu esquema é meio complicado demais, não? Não é mais simples fazer isso?

Para logar:

session.setAttribute("idSession", "LOGADO");

Verificação:

if("LOGADO".equals(session.getAttribute("idSession")){  
//Logado  
}else{  
//Redirect sair/inicial.  
}

Hein?

hmm, quanto a questão de utilizar o ID da session eu não sei se ele pode trocar por alguma “n” razão, mas isso eu vou pesquisar. O problema em questão é saber se tem como “dividir” a session, deixar atributos visiveis somente do diretorio da pagina atual para baixo.

Assim, eu tenho alguns sistemas diferentes, alguns não tem nada haver com outros alguns tem alguma relação mas de um modo geral acabam que todos são interconectados, por exemplo, Tem os contatos das empresas la tem o telefone e tal de cada uma, uma aluga as impressoras, as mesmas impressoras tem IP, são ligadas no outro sistema que gerencia o IP, acaba tudo sendo um SISTEMÃO, problema nenhum até ai ta tudo bem organizado.

A questão é que certos pontos, visões das paginas eu precisava liberar para usuarios comuns, mas eu ja tenho o sistema todo pronto e unificado na pagina principal do servidor

[color=blue]http://IP_DO_SERVIDOR/SISTEMA_UNIFICADO[/color]

a minha ideia era abrir novas “views” para cada um independente pra não ter que alterar toda a estrutura das paginas que ja estão prontas e funcionando muito bem, pois bem, até comecei e criei uma e logo me deparei com o problema, [color=darkred]se eu criar uma view separada, quando eu alterar a classe do sistema principal eu preciso ir la e alterar tambem a do outro sistema, fazendo um trabalho desnecessario.[/color] Já se fosse possivel dividir a session dentro do proprio SISTEMA_UNIFICADO, eu ja utilizaria tudo que tava pronto, o que eu não posso correr o risco é de um “espertinho” logar na pagina comum, e colocar a URL de uma pagina admin.

Eu até tinha feito os menus aparecerem de acordo com o acesso de cada um, com as tabelas de sistemas permitidos para cada ususario [color=blue](TABELA USUARIO, TABELA DE SISTEMA, TABELA DE UNIÃO USUARIO SISTEMA)[/color], mas ainda sim era possivel acessar via URL, então coloquei antes de cada pagina a verificação se tem ou não permissão pra acessar aquela pagina em questão. Funciona? Funciona mas quando eu fiz isso, percebi uma queda de desempenho bem visivel, claro que pequena em termos de servidor cliente localhost e rede interna, mas ainda sim visivel.

É Simples, queria saber se tem como gerar a divisão que o tomcat tem padrão na apsta [color=darkblue]webapps[/color], cada pasta/sistema_web colocado la dentro tem sua session que não é visivel para a outra pasta [color=blue]webapps[/color], mesmo se logado em uma pasta do webapps, a session é diferente se voce troca a pasta raiz de sistema 1 pra sistema 2 os valores da session não são visiveis.

Assim eu teria

[color=blue]webapps/geral/sistema_geral/pastas e afins
webapps/geral/view_1/
webapps/geral/view_2/
webapps/geral/view_3/
[/color]
Cada um com as sessions diferentes, mas ainda sem todos no mesmo [color=blue]webapps[/color];
utilizo meu pacote de classes para todos, e cada alteração afeta todos de uma unica vez.

Caso não tenha como então ai penso numa logica pra resolver isso via classe ou sei la, alguma coisa que não tenha que verificar o banco a cada acesso.

Você não deve setar o id da sessão…Isso é feito automáticamente pelo container no momento que vc faz um request.getSession()…Se for uma sessão nova um cookie é retornado ao cliente com seu JSESSIONID…

Para vc saber se uma sessão é diferente da outra entre suas páginas você pode utilizar request.getSession().isNew()…

Em relação aos atributos, se você quiser deixar apenas na sua página atual não os sete no escopo da sessão mas sim no escopo da requisição…

Hmm, eu testei com request.setAttribute mas ai o atributo fica visivel apenas para uma unica pagina onde foi setado, tornando impossivle uma pagina de loggin com request.getAttribute(atributo), pois sempre retorna NULL uma vez que foi setado em outra pagina e so tem validade la. Fiz o seguinte teste aqui.

pagina logica do loggin.

request.setAttribute("x", "view1");
response.sendRedirect("view1.jsp");

view1.jsp

    out.println(request.getAttribute("x"));
    if (request.getAttribute("x") != null && request.getAttribute("x").equals("view1")) {
%>
    <br /><font color="blue">ACESSO LIBERADO</font><br />
&lt;%                } else {
%&gt;
    <br /><font color="red">ACESSO NEGADO</font><br />
&lt;%                    }
    request.setAttribute(&quot;x&quot;, &quot;view1&quot;);
    out.println(request.getAttribute(&quot;x&quot;));

resultado:


null
[color=red]ACESSO NEGADO[/color]
view1


Olhando o proprio exemplo do tomcat de session eu fiz essa classe que resolve o problema.

Primeiro eu fasso o select no banco com os joins corretos e obtenho as tabelas que o usuario tem acesso, e então guardo essas tabelas na session.

session.setAttribute(result.getString(&quot;sys_id&quot;), result.getString(&quot;sys_nome&quot;));

Classe

import java.util.Enumeration;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;

public class Permissao extends HttpServlet {

    public boolean getPermissao(HttpSession session, String sistema) {
        boolean retorno = false;
        try {
            Enumeration tabelas = session.getAttributeNames();
            while (tabelas.hasMoreElements()) {
                if (session.getAttribute(tabelas.nextElement().toString()).equals(sistema) || session.getAttribute(tabelas.nextElement().toString()).equals(&quot;ALL&quot;)) {
                    retorno = true;
                    break;
                }
            }
        } catch (NullPointerException e) {
        } catch (IllegalStateException e) {
        }
        return retorno;
    }
}

dai eu troquei a verificação da pagina de:

if(session.getId().equals(session.getAttribute(&quot;idSession&quot;)){    
    //Logado    
}else{    
    //Redirect sair/inicial.    
}

Para:

Permissao acesso = new Permissao();
if (acesso.getPermissao(request.getSession(), &quot;telefone&quot;)) {
    //Logado
} else {
    //Redirect
}

Obs: a verificação na classe [color=blue] equals("ALL")[/color] serve pra ver se ta como ADMIN pra ter acesso a todas as paginas, é setado quando pego as permições do usuario nas tabelas, tem o atributo [color=red]admin[/color]

Aqui a classe do tomcat que eu usei como exemplo, da pra acessa facil no seu servidor: [color=blue] ip_server:8080/servlets-examples/sessions.html[/color]

//Source Code for Session Example

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionExample extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType(&quot;text/html&quot;);
        PrintWriter out = response.getWriter();
        
        HttpSession session = request.getSession(true);

        // print session info

        Date created = new Date(session.getCreationTime());
        Date accessed = new Date(session.getLastAccessedTime());
        out.println(&quot;ID &quot; + session.getId());
        out.println(&quot;Created: &quot; + created);
        out.println(&quot;Last Accessed: &quot; + accessed);

        // set session info if needed

        String dataName = request.getParameter(&quot;dataName&quot;);
        if (dataName != null && dataName.length() &gt; 0) {
            String dataValue = request.getParameter(&quot;dataValue&quot;);
            session.setAttribute(dataName, dataValue);
        }

        // print session contents

        Enumeration e = session.getAttributeNames();
        while (e.hasMoreElements()) {
            String name = (String)e.nextElement();
            String value = session.getAttribute(name).toString();
            out.println(name + &quot; = &quot; + value);
        }
    }
}