Gerenciamento de sessão do Tomcat - sessão independente em um host

1

Eu tenho um jsp-site simples no tomcat. Para trabalhar com a sessão eu uso o objeto simples jsp session .

Mas eu preciso de isolamento de algumas sessões em meus diretórios da web e.q.

mysite.com/dir1 
mysite.com/dir2

Eu quero usar sessões independentes para cada dir1 e dir2

É possível com correção mínima de código jsp e sem uso de hosts virtuais?

    
por triclosan 23.06.2012 / 10:56

2 respostas

1

O Tomcat oferece algum controle sobre o caminho do cookie de sessão com o parâmetro de contexto sessionCookiePath , mas não o suficiente para as suas necessidades. Eu acredito que você pode jogar rápido e solto com o servidor (container servlet) e o navegador com muito pouco código.

Em suma, escreva um filtro de servlet que permita a entrada, inalterada. Quando a resposta sair, adicione o caminho do servlet ao caminho do cookie JSESSIONID e deixe o navegador enviar um JSESSIONID diferente (assim, usando uma sessão diferente) para cada servlet.

Veja como funciona:

  1. Quando uma solicitação é enviada pela primeira vez, ela fica "nua", não tem nenhum cookie associado a ela. Não tem sessão.
  2. O servidor criará um e associará um JSESSIONID a ele e adicionará um cookie para permitir que o cliente faça sua parte no rastreamento.
  3. O cliente ainda está aguardando sua solicitação inicial neste momento.
  4. No filtro de servlet (ou mod_rewrite), adicione o caminho do servlet ao caminho do cookie.
  5. Envie a resposta para o cliente.

Com o cookie personalizado para servlet /dir1 , quando o navegador enviar uma solicitação para /dir2 , ele também estará "nu", sem cookies. Uma nova sessão será criada, o filtro adicionará o caminho a ela e assim por diante ...

Do ponto de vista do servidor, existem dois clientes (com o mesmo IP). Um está sempre usando /dir1 servlet e o outro está usando apenas /dir2 servlet. Nada de errado com isso.

Aqui está uma implementação de filtro que pode dar uma vantagem . Você também pode considerar fazê-lo no Apache com mod_headers .

    
por 29.06.2012 / 06:56
0

A pergunta é por que você quer fazer isso.

Se estiver relacionado à segurança, você deverá implantar o dir1 e o dir2 como diferentes servlets. Servlets diferentes têm sessões diferentes, portanto, seu problema deve ser resolvido.

Se isso não for uma opção e sua motivação não tiver nada a ver com segurança, você poderá adicionar um mapa para cada caminho para sua sessão. Em seguida, você teria que acessar seus objetos de sessão primeiro obtendo o mapa do caminho e, em seguida, acessando o objeto de sessão (por exemplo, $ {session.dir1.foo}).

Uma terceira solução pode ser usar um filtro para ocultar determinados elementos na sessão para a solicitação atual, criando um HttpServletRequestWrapper que retorna um HttpSession especial para solicitações diferentes.

    
por 26.06.2012 / 19:58

Tags