Descreva em detalhes o mecanismo de gerenciamento da sessão em Tomcat:
1. Operação de sessão durante o processo de solicitação:
Breve descrição: Durante o processo de solicitação, primeiro analise as informações da sessão na solicitação e, em seguida, armazene o SessionID na lista de parâmetros da solicitação. Então, quando você obtém a sessão da solicitação, se o SessionId existir, você receberá a sessão do pool de sessão com base no ID. Se o SessionID não existir ou a sessão falhar, crie uma nova sessão e coloque as informações da sessão no pool de sessão para o próximo uso.
(1) Diagrama de tempo do processo de análise de sessionID:
Visão geral: Primeiro, o usuário envia uma solicitação HTTP para passá -la para HTTP11Processor e depois a passa para o coyoteAdapter via HTTP11Processor. O coyoteadapter é um adaptador que adapta o org.apache.coyote.request encapsulado pela estrutura do coyote para org.apache.catalina.connector.request (não vou dizer muito sobre esse processo, que já foi resumido antes). Após a conversão, o método parsepathparameter será chamado para analisar as informações dos cookies nos parâmetros do caminho (porque quando o cookie é desativado pelo navegador, as informações de cookie serão reescritas no URL). Primeiro, tente analisar o SessionID do URL. Em seguida, o parsesessioncookiesid será chamado. Isso é para analisar o IDid a partir do cookie e armazená -lo na solicitação (parsepathparameters e parsesessessioncookiesid métodos. Durante o processo de chamada, nenhuma lógica óbvia do XOR é vista, ou seja, que você é executado, mas não se sabe, mas você não se sabe, mas você não tem um problema, que você não tem, se você deve ser o que você deve ser usado para que você se sinta, se você se reescreva. não tem problema). A análise para o SessionID e colocou -o na solicitação. Não há problema em analisar a lógica do SessionID.
Os seguintes códigos -chave são publicados:
Método ParsePathParameters (analisado a partir de URL de reescrita):
PS: As peças marcadas estão analisando variáveis do URL e as colocam na lista de parâmetros de solicitação.
Método ParsesessionCookiesid (analisando a SessionID de Cookies):
PS: A tag acima é obter o SessionID do cookie. Veja a primeira tag com uma chamada para sessionConfig.GetSessionCiename (contexto), aqui você receberá uma chave do sessionID padrão. Essa chave é definida no SessionConfig e seu valor é JSessionId:
(2) O processo de obtenção da sessão da solicitação é basicamente conforme descrito acima. Em seguida, dê uma olhada no processo de obtenção de sessão em servlet:
Visão geral: o AppServlet é um servlet que nos definimos. Quando obtemos a sessão através do Reqest, o httpServletRequest (uma interface) chamado é realmente requestfacade (uma fachada que encapsula o org.apache.catalina.connector.request) e, em seguida, solicitar o Method Method of GetSession da solicitação real. A lógica específica da solicitação é ligar para o método getManger do contêiner de contexto para obter o gerente da sessão (os detalhes do gerente da sessão são descritos abaixo). Se o SessionID tiver sido analisado, o método do FindSession será chamado para obter a sessão correspondente no pool de objetos da sessão. Caso contrário, se o SessionID não existir, uma sessão precisará ser recriada e colocada no pool de objetos da sessão.
Os seguintes códigos -chave são publicados:
O método GetSession of Class RequestFacade:
O método GetSession de solicitação de classe:
O método do dogetSession de solicitação de classe:
PS: A primeira tag é obter informações de sessão do pool de objeto de sessão com base no SessionID, e a segunda tag é criar um novo objeto de sessão sem analisar o SessionID.
Isso cria uma nova sessão. Este ponto envolve a geração do novo SessionID. O código de chave lógico para gerar sessionID é definido no método GeneatesessionSedid no gerador da classe SessionID:
O exposto acima é o processo de sessão de obtenção de servlet. Os detalhes a seguir resumem como o Tomcat gerencia a sessão, ou seja, o conhecimento do gerente de sessão.
2. Mecanismo de gerenciamento de sessão
Definição do gerente de sessão: o componente do Session Manager é responsável pelo gerenciamento de objetos da sessão, como criar e destruir objetos de sessão.
Primeiro, vejamos um diagrama de estrutura de herança de classe do gerenciador de sessões (este é o gráfico de tocmat7.x, e o mecanismo de herança de classe do tomcat5 é muito diferente disso):
Breve descrição: a seguir resume cada categoria por sua vez (consulte as informações oficiais do site):
(1) Gerente: define a interface básica associada a um determinado contêiner para gerenciar o pool de sessões.
(2) GerenciadorBase: implementa a interface do gerente, que fornece a implementação de funções comuns do gerente da sessão.
(3) StandardManager: herda do gerentebase, o gerenciador de sessão padrão (não especificando a configuração, use isso por padrão). É uma implementação não em cluster das sessões de processamento do Tomcat (ou seja, a versão independente). Quando o tomcat estiver fechado, as informações da sessão de memória serão persistidas no disco e salvas como sessão.ser, e serão restauradas ao inicializar novamente.
(4) PersistentManagerBase: herdado do gerentebase, implementa e define as funções básicas da persistência do gerente de sessão.
(5) PersistentManager: herdado do PersistentManagerBase. A função principal é trocar objetos de sessão ociosa (definindo o tempo de tempo limite) no disco.
(6) ClusterManager: Ele implementa a interface do gerente e você deve ser adivinhado pelo nome da classe. Este é o gerente que gerencia a sessão do cluster e o gerente de sessão da versão independente do StandardManager acima são conceitos relativos. Esta classe define a interface de replicação e compartilhamento de sessões entre as classes.
(7) ClusterManagerBase: implementa a interface clusterManager e herda do Gerenciador. Esta classe implementa a operação básica da replicação da sessão.
(8) BackupManager: herdado do ClusterManagerBase, uma implementação da estratégia de replicação de sessão entre cluster. Existe apenas um nó de backup nos dados da sessão e todos os nós no cluster são visíveis no local desse nó de backup. Esse design oferece uma vantagem no suporte a implantações heterogêneas.
(9) Deltamanager: herdado da ClusterManagerBase, uma implementação da estratégia de replicação de sessões de cluster. Diferentemente do backupManager, os dados da sessão serão copiados para todos os nós de membros no cluster, o que exige que todos os nós no cluster sejam isomórficos e o mesmo aplicativo seja implantado.
Suplemento: vamos resumir em detalhes abaixo. Há uma loja de variáveis de membros na classe PersistentManagerBase:
A estratégia de armazenamento do gerente de sessão persistente é definida por este objeto de loja. A estrutura de herança de classe desta loja é a seguinte:
Breve descrição: o armazenamento de interface e seus exemplos fornecem um conjunto de estratégias de armazenamento para o gerenciador de sessões. A loja define a interface básica e a base de lojas fornece a implementação básica. A política implementada pela classe FileStore é armazenar a sessão em um arquivo especificado no diretório com setDirectory () e terminar com .Session. A classe JDBCStore armazena a sessão no banco de dados através do JDBC. Portanto, é necessário usar o JDBCStore. Você precisa chamar o método setDriverName () e o método setConnectionurl (), respectivamente, para definir o nome do driver e o URL da conexão.
3. Configuração relacionada à sessão de Tomcat
Resuma a configuração e as configurações relacionadas à sessão de dois níveis. Antes de tudo, a partir do nível do arquivo de configuração, a sessão tem um tempo de validade e o tempo de expiração padrão é definido em $ catalina_home/conf/web.xml. A configuração padrão específica é a seguinte (o tempo de expiração padrão é 30min, ou seja, não há acesso em 30 minutos e a sessão expira):
Outro ponto é que, se o gerenciamento da sessão não estiver configurado, o StandardManager será usado por padrão. No entanto, se você deseja configurá -lo, poderá especificá -lo em $ catalina_home/conf/context.xml (a partir desta configuração, você pode ver que o gerenciador de sessões está associado ao contêiner de contexto, o que significa que cada aplicativo da Web terá um gerenciador de sessão). A configuração específica é a seguinte:
TomCat7.x Padrões para a configuração deste gerente. Se o PersistentManager que você deseja especificar for o gerente padrão, você pode especificar assim:
De fato, depois de ver isso, descobri que a Política de Armazenamento de Sessão ou Armazenamento pode ser personalizada desde que a interface relevante seja implementada. Não há problema em escrever uma configuração aqui.
Além disso, vamos resumir do nível de código: algumas informações de configuração da sessão estão escritas no código, por exemplo, a classe SessionConfig define algumas informações de configuração da sessão. O nome da sessão no cookie é JSession. Quando a sessão é colocada no caminho através da reescrita de URL, o nome do valor -chave é JSessionIds. O código específico é o seguinte:
Outro ponto é que o comprimento especificado do padrão do SessionID é de 16 bytes, que é especificado no SessionIdGenerator:
OK, muito está resumido sobre a configuração padrão.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.