1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */

17 package org.apache.catalina.util;
18
19 public class StandardSessionIdGenerator extends SessionIdGeneratorBase {
20
21     @Override
22     public String generateSessionId(String route) {
23
24         byte random[] = new byte[16];
25         int sessionIdLength = getSessionIdLength();
26
27         // Render the result as a String of hexadecimal digits
28         // Start with enough space for sessionIdLength and medium route size
29         StringBuilder buffer = new StringBuilder(2 * sessionIdLength + 20);
30
31         int resultLenBytes = 0;
32
33         while (resultLenBytes < sessionIdLength) {
34             getRandomBytes(random);
35             for (int j = 0;
36             j < random.length && resultLenBytes < sessionIdLength;
37             j++) {
38                 byte b1 = (byte) ((random[j] & 0xf0) >> 4);
39                 byte b2 = (byte) (random[j] & 0x0f);
40                 if (b1 < 10)
41                     buffer.append((char) ('0' + b1));
42                 else
43                     buffer.append((char) ('A' + (b1 - 10)));
44                 if (b2 < 10)
45                     buffer.append((char) ('0' + b2));
46                 else
47                     buffer.append((char) ('A' + (b2 - 10)));
48                 resultLenBytes++;
49             }
50         }
51
52         if (route != null && route.length() > 0) {
53             buffer.append('.').append(route);
54         } else {
55             String jvmRoute = getJvmRoute();
56             if (jvmRoute != null && jvmRoute.length() > 0) {
57                 buffer.append('.').append(jvmRoute);
58             }
59         }
60
61         return buffer.toString();
62     }
63 }
64