Maison > Java > javaDidacticiel > Comment résoudre le problème selon lequel le paramètre de délai d'expiration de la session Springboot2 n'est pas valide

Comment résoudre le problème selon lequel le paramètre de délai d'expiration de la session Springboot2 n'est pas valide

PHPz
Libérer: 2023-05-22 13:49:50
avant
3008 Les gens l'ont consulté

Problème : 

Aujourd'hui, nous avons rencontré un problème de délai d'expiration dans le projet. Les modifications de application.properties dans SpringBoot2 n'ont jamais pris effet.

Solution :

  • Le conteneur intégré utilisé par Spring Boot est contrôlé par les propriétés du serveur.*. Spring Boot créera une instance du conteneur de servlet à l'aide de l'une des instances ServletWebServerFactory. Ces classes utilisent les attributs server.* pour configurer les conteneurs de servlets gérés (tels que Tomcat, Jetty, etc.).

  • Lorsque l'application est packagée dans un fichier war et déployée sur une instance Tomcat, les attributs server.* ne peuvent pas être utilisés. Celles-ci ne s'appliquent pas car le conteneur de servlet prédéfini peut être utilisé (puisque le service s'exécute à distance). Par conséquent, le déploiement sur un Tomcat distant rendra les propriétés server.* inutiles.

1. Modifiez le fichier de configuration en fonction de la publication sur Internet (s'il est démarré par Jar, il prendra effet), comme suit :

server:
  servlet:
    session:
      timeout: PT1H        # 1小时过期
      cookie:
        max-age: PT1H      # 1小时过期
Copier après la connexion

Remarque : PT1H signifie définir le délai d'expiration de la session sur 1 heure. .

Extension : Duration

Découvrez la méthode setTimeouot en consultant le code source de springboot Ici, l'instance de Duration doit être transmise dans

public void setTimeout(Duration timeout) {
       this.timeout = timeout;
    }
Copier après la connexion

Duration est nouvellement ajoutée dans Java8 et est principalement utilisée pour calculer la différence de date. est déclaré final et est thread-safe.

Si vous convertissez une chaîne, cela est similaire à la méthode de formatage de date de SimpleDateFormat

Duration. Les chaînes sont similaires aux nombres, qui sont positifs et négatifs : la valeur par défaut est positive, le négatif commence par "-", suivi de "PT". ', et la lettre de temps ci-dessous :

  • 'D' - Jours

  • 'H' - Heures

  • 'M' - Minutes

  • 'S' - Secondes

Chaque unité doit commencer par un nombre, et l'ordre des heures, minutes et secondes ne peut pas être gâché, par exemple : PT2H3M2S est égal à -PT-2H-3M-2S.

2. Définissez le délai d'expiration de la session de tomcat

1) Dans le répertoire conf de tomcat, changez servler.xml :

<Context path="/abtest" docBase="/abtest"  
  defaultSessionTimeOut="3600" isWARExpanded="true"  
  isWARValidated="false" isInvokerEnabled="true"  
  isWorkDirPersistent="false"/>
Copier après la connexion

2) Changez web.xml dans le projet :

<session-config>  
    <session-timeout>20</session-timeout>  
</session-config>
Copier après la connexion

3) Changez

session.setMaxInactiveInterval(30*60);
Copier après la connexion

dans le programme Lorsque vous rencontrez le même problème, veuillez lire les lettres rouges ci-dessus et résoudre le problème dans l'ordre.

Code de test :

@RestController
@RequestMapping("/valid-time")
public class TestController { 
    @GetMapping("/test")
    public String validTime(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(); 
        int sessionTime = session.getMaxInactiveInterval(); 
        return new StringBuilder("sessionTime=").append(sessionTime).toString();
    }
}
Copier après la connexion

La désynchronisation du temps entraîne un énorme piège en cas d'échec de la session Spring

La désynchronisation du temps du serveur Linux entraîne un énorme piège en cas d'échec de la session Spring

En raison des besoins de l'entreprise , l'environnement autonome d'origine a été converti en un environnement clusterisé, afin de ne pas modifier la tâche, spring session + redis a été choisi comme solution de partage de session.

Après avoir confirmé la solution technique, j'ai recherché de nombreuses informations sur la session de printemps sur Internet. Après l'avoir lu et n'avoir trouvé aucune erreur de la part des personnes précédentes, j'ai commencé à travailler dessus.

Le processus d'installation de Redis est ignoré.

Ajoutez une session Spring au projet étape par étape en fonction des informations. Le projet à nœud unique s'est exécuté avec succès sans aucune erreur et la session a été écrite avec succès sur Redis.

Ensuite, par souci de sécurité, j'ai installé nginx sur mon ordinateur et déployé 3 tomcats. Tout semblait parfait, et le partage de session s'est effectué entre plusieurs nœuds.

Tous les préparatifs préliminaires sont terminés jusqu'à présent, il ne reste que la dernière étape.

Le cauchemar commence...

Déployez tous les nœuds en ligne, puis ouvrez le navigateur pour accéder avec succès à l'application. Bien sûr, nous ne pouvons pas nous contenter de voir la page terminée, nous devons quand même nous connecter, donc. ...

Puis...

J'ai saisi le mot de passe utilisateur d'innombrables fois, indiquant que la connexion a réussi, mais le résultat final était toujours rejeté, o(╥﹏╥)o

La prochaine étape est d'innombrables voyages pour remplir les fosses

Regardez le journal... ...

Regardez diverses demandes...

Je soupçonne qu'il y a un BUG dans la session de printemps...

J'ai même allumé la télécommande Débogage en mode DEBUG, et j'ai finalement vu dans le mode DEBUG universel que lorsque la session de printemps obtientSession, si la session est obtenue,Tout d'abord, il sera jugé si la session a expiré. La méthode de comparaison est également très simple, ce qui est le cas. pour obtenir l'heure actuelle du système et la comparer avec l'heure d'expiration de la session. Si l'heure actuelle est inférieure à l'heure d'expiration, cela signifie que la session n'a pas expiré. En voyant cela, j'ai immédiatement ressenti un sentiment d'illumination, et le petit univers a finalement éclaté ici.

Nima—> Toutes les sessions acquises ont expiré, et puis... puis... bien sûr, j'ai couru précipitamment pour vérifier l'heure du serveur, alors... j'ai pleuré o(╥﹏╥)o, il s'avère c'est toi qui m'as trompé. Je...

Pour commémorer ce pit trip, je publie cet article

De plus, j'enregistrerai la synchronisation de l'heure du serveur Linux

commande date :

date : Afficher l'heure actuelle, les résultats sont les suivants : Mar 4 mars 01:36:45 CST 2017

date -s 09:38:40 : Réglez l'heure actuelle, le résultat est le suivant : Mar 4 mars 09:38 : 40 Commande CST 2017

ntpdate:

NTPDate -u ntp. Shanghai) : ntp.api.bz

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal