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