Sob quais condições um JSESSIONID é criado?

276

Quando / quais são as condições quando a JSESSIONIDé criado?

É por domínio? Por exemplo, se eu tiver um servidor de aplicativos Tomcat e implantar vários aplicativos da Web, será JSESSIONIDcriado um diferente por contexto (aplicativo da Web) ou será compartilhado entre aplicativos da Web desde que sejam do mesmo domínio?

joshjdevl
fonte

Respostas:

324

O cookie JSESSIONID é criado / enviado quando a sessão é criada. A sessão é criada quando o seu código chama request.getSession()ou request.getSession(true)pela primeira vez. Se você deseja apenas obter a sessão, mas não criá-la se ela não existir, use request.getSession(false)- isso retornará uma sessão ou null. Nesse caso, a nova sessão não é criada e o cookie JSESSIONID não é enviado. (Isso também significa que a sessão não é necessariamente criada na primeira solicitação ... você e seu código estão no controle quando a sessão é criada)

As sessões são por contexto:

Escopo da Sessão SRV.7.3

Os objetos HttpSession devem ter um escopo definido no nível do aplicativo (ou contexto do servlet). O mecanismo subjacente, como o cookie usado para estabelecer a sessão, pode ser o mesmo para diferentes contextos, mas o objeto referenciado, incluindo os atributos desse objeto, nunca deve ser compartilhado entre contextos pelo contêiner.

( Especificação Servlet 2.4 )

Atualização: Toda chamada para a página JSP cria implicitamente uma nova sessão se ainda não houver uma sessão. Isso pode ser desativado com a session='false'diretiva page, caso em que a variável de sessão não está disponível na página JSP.

Peter Štibraný
fonte
2
Não é possível criar uma sessão sem uma chamada explícita para getSession? em relação ao "não deve ser compartilhada entre os contextos pelo contêiner", websphere tem uma opção para sessões de compartilhamento, que é a motivação para a questão :)
joshjdevl
Não se você usar apenas a API do Servlet. Entretanto, pode haver extensões específicas do servidor (como o compartilhamento de sessões do Websphere, como você indica).
Peter Štibraný
Eu acredito que o arquivo context.xml pode controlar a criação sessão automático se a <Context> tag contém um atributo cookies, por exemplo, <biscoitos context = "false">
BT
No momento, estou recebendo muitos acessos no meu filtro para criar uma sessão e parece que é apenas após a criação do segundo hit (não uma atualização da segunda página), isso chamou minha atenção "a sessão não é necessariamente criada na primeira solicitação .." está relacionado? você poderia dar um exemplo de por que isso não é necessariamente criado na primeira solicitação? Obrigado!
jpganz18
@ jpganz18: Se você simplesmente liga para request.getSession()ou request.getSession(true), então recebe uma sessão nova ou existente. No entanto, se o seu código chamar request.getSession(false), você terá uma sessão existente ou nula, se não houver uma sessão.
Peter Štibraný
49

Aqui estão algumas informações sobre mais uma fonte do JSESSIONIDcookie:

Eu estava apenas depurando algum código Java que é executado em um servidor tomcat. Eu não estava chamando request.getSession()explicitamente em nenhum lugar do meu código, mas notei que um JSESSIONIDcookie ainda estava sendo definido.

Finalmente, examinei o código Java gerado correspondente a uma JSP no diretório de trabalho no Tomcat.

Parece que, gostando ou não, se você chamar uma JSP de um servlet, JSESSIONIDserá criado!

Adicionado: acabei de descobrir isso adicionando a seguinte diretiva JSP:

<%@ page session="false" %>

você pode desativar a configuração de JSESSIONIDum JSP.

Rangachari Anand
fonte
3
Em outras palavras: o valor padrão para o atributo da sessão da página é "true". O que pode ser inesperado em alguns (muitos?) Casos.
David Balažic
Também estou no tomcat e não uso jsp, mas o cookie da sessão é criado de qualquer maneira. Alguma idéia de como evitá-lo nesta situação?
ClassyPimp
23

CORREÇÃO: Vote na resposta de Peter Štibraný - é mais correta e completa!

Um "JSESSIONID" é o ID exclusivo da sessão http - veja o javadoc aqui . Lá, você encontrará a seguinte frase

As informações da sessão têm como escopo apenas o aplicativo da web atual (ServletContext), portanto, as informações armazenadas em um contexto não serão diretamente visíveis em outro.

Portanto, quando você acessa um site pela primeira vez, uma nova sessão é criada e vinculada ao SevletContext. Se você implantar vários aplicativos, a sessão não será compartilhada.

Você também pode invalidar a sessão atual e, portanto, criar uma nova. por exemplo, ao mudar de http para https (após o login), é uma boa ideia criar uma nova sessão.

Espero que isso responda sua pergunta.

Mo.
fonte
1
Explicação clara do escopo da sessão.
precisa saber é o seguinte
@Mo a ligação é interrompida
Timofey
8

Cuidado se sua página estiver incluindo outros arquivos .jsp ou .jspf (fragmento)! Se você não definir

<%@ page session="false" %>

neles também, a página pai terminará iniciando uma nova sessão e configurando o cookie JSESSIONID.

Para páginas .jspf, em particular, isso acontece se você configurou seu web.xml com um fragmento:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

para ativar os scriptlets dentro deles.

polaretto
fonte
Você quer dizer set page session = false em todos os fragmentos incluídos (.jsp e .jspf) e não o inclui no jsp principal que inclui o restante dos trechos?
Omegawn
2

Para links gerados em um JSP com tags personalizadas, eu tive que usar

<%@ page session="false" %>

no JSP

E

request.getSession().invalidate();

na ação Struts

Jerome Jaglale
fonte