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.
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.
server: servlet: session: timeout: PT1H # 1小时过期 cookie: max-age: PT1H # 1小时过期
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; }
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.
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"/>
2) Changez web.xml dans le projet :
<session-config> <session-timeout>20</session-timeout> </session-config>
3) Changez
session.setMaxInactiveInterval(30*60);
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(); } }
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
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!