/*
 * 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.authenticator;

import java.io.Serializable;

import org.apache.catalina.Context;
import org.apache.catalina.Session;

Key used by SSO to identify a session. This key is used rather than the actual session to facilitate the replication of the SSO information across a cluster where replicating the entire session would generate significant, unnecessary overhead.
/** * Key used by SSO to identify a session. This key is used rather than the * actual session to facilitate the replication of the SSO information * across a cluster where replicating the entire session would generate * significant, unnecessary overhead. * */
public class SingleSignOnSessionKey implements Serializable { private static final long serialVersionUID = 1L; private final String sessionId; private final String contextName; private final String hostName; public SingleSignOnSessionKey(Session session) { this.sessionId = session.getId(); Context context = session.getManager().getContext(); this.contextName = context.getName(); this.hostName = context.getParent().getName(); } public String getSessionId() { return sessionId; } public String getContextName() { return contextName; } public String getHostName() { return hostName; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode()); result = prime * result + ((contextName == null) ? 0 : contextName.hashCode()); result = prime * result + ((hostName == null) ? 0 : hostName.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } SingleSignOnSessionKey other = (SingleSignOnSessionKey) obj; if (sessionId == null) { if (other.sessionId != null) { return false; } } else if (!sessionId.equals(other.sessionId)) { return false; } if (contextName == null) { if (other.contextName != null) { return false; } } else if (!contextName.equals(other.contextName)) { return false; } if (hostName == null) { if (other.hostName != null) { return false; } } else if (!hostName.equals(other.hostName)) { return false; } return true; } @Override public String toString() { // Session ID is 32. Standard text is 36. Host could easily be 20+. // Context could be anything from 0 upwards. 128 seems like a reasonable // size to accommodate most cases without being too big. StringBuilder sb = new StringBuilder(128); sb.append("Host: ["); sb.append(hostName); sb.append("], Context: ["); sb.append(contextName); sb.append("], SessionID: ["); sb.append(sessionId); sb.append(']'); return sb.toString(); } }