今天在部署springboot項目到阿里雲時,出現登陸方法執行特別慢的問題。剛開始覺得是卡死了,等了3,4分鐘才進去,最後會出現以下信息:css
2018-01-28 15:38:36.958 INFO 4374 --- [p-nio-80-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [329,771] milliseconds. 2018-01-28 15:38:36.976 INFO 4374 --- [p-nio-80-exec-9] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [45,744] milliseconds.
從提示信息看,是sessionID相關的生成器的提示。在搜索SessionIdGeneratorBase以後,發現是tomcat的session生成策略。完整代碼以下:java
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.util; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleState; import org.apache.catalina.SessionIdGenerator; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; public abstract class SessionIdGeneratorBase extends LifecycleBase implements SessionIdGenerator { private static final Log log = LogFactory.getLog(SessionIdGeneratorBase.class); private static final StringManager sm = StringManager.getManager("org.apache.catalina.util"); /** * Queue of random number generator objects to be used when creating session * identifiers. If the queue is empty when a random number generator is * required, a new random number generator object is created. This is * designed this way since random number generators use a sync to make them * thread-safe and the sync makes using a a single object slow(er). */ private final Queue<SecureRandom> randoms = new ConcurrentLinkedQueue<>(); private String secureRandomClass = null; private String secureRandomAlgorithm = "SHA1PRNG"; private String secureRandomProvider = null; /** Node identifier when in a cluster. Defaults to the empty string. */ private String jvmRoute = ""; /** Number of bytes in a session ID. Defaults to 16. */ private int sessionIdLength = 16; /** * Get the class name of the {@link SecureRandom} implementation used to * generate session IDs. * * @return The fully qualified class name. {@code null} indicates that the * JRE provided {@link SecureRandom} implementation will be used */ public String getSecureRandomClass() { return secureRandomClass; } /** * Specify a non-default {@link SecureRandom} implementation to use. The * implementation must be self-seeding and have a zero-argument constructor. * If not specified, an instance of {@link SecureRandom} will be generated. * * @param secureRandomClass The fully-qualified class name */ public void setSecureRandomClass(String secureRandomClass) { this.secureRandomClass = secureRandomClass; } /** * Get the name of the algorithm used to create the {@link SecureRandom} * instances which generate new session IDs. * * @return The name of the algorithm. {@code null} or the empty string means * that platform default will be used */ public String getSecureRandomAlgorithm() { return secureRandomAlgorithm; } /** * Specify a non-default algorithm to use to create instances of * {@link SecureRandom} which are used to generate session IDs. If no * algorithm is specified, SHA1PRNG is used. To use the platform default * (which may be SHA1PRNG), specify {@code null} or the empty string. If an * invalid algorithm and/or provider is specified the {@link SecureRandom} * instances will be created using the defaults for this * {@link SessionIdGenerator} implementation. If that fails, the * {@link SecureRandom} instances will be created using platform defaults. * * @param secureRandomAlgorithm The name of the algorithm */ public void setSecureRandomAlgorithm(String secureRandomAlgorithm) { this.secureRandomAlgorithm = secureRandomAlgorithm; } /** * Get the name of the provider used to create the {@link SecureRandom} * instances which generate new session IDs. * * @return The name of the provider. {@code null} or the empty string means * that platform default will be used */ public String getSecureRandomProvider() { return secureRandomProvider; } /** * Specify a non-default provider to use to create instances of * {@link SecureRandom} which are used to generate session IDs. If no * provider is specified, the platform default is used. To use the platform * default specify {@code null} or the empty string. If an invalid algorithm * and/or provider is specified the {@link SecureRandom} instances will be * created using the defaults for this {@link SessionIdGenerator} * implementation. If that fails, the {@link SecureRandom} instances will be * created using platform defaults. * * @param secureRandomProvider The name of the provider */