@SuppressWarnings({"checkstyle:BooleanExpressionComplexity", "checkstyle:MethodCount"})
    protected boolean onEquals(SimpleSession ss) {
        return (getStartTimestamp() != null ? getStartTimestamp().equals(ss.getStartTimestamp()) : ss.getStartTimestamp() == null)
                && (getStopTimestamp() != null ? getStopTimestamp().equals(ss.getStopTimestamp()) : ss.getStopTimestamp() == null)
                && (getLastAccessTime() != null
                        ? getLastAccessTime().equals(ss.getLastAccessTime()) : ss.getLastAccessTime() == null)
                && (getTimeout() == ss.getTimeout())
                && (isExpired() == ss.isExpired())
                && (getHost() != null ? getHost().equals(ss.getHost()) : ss.getHost() == null)
                && (getAttributes() != null ? getAttributes().equals(ss.getAttributes()) : ss.getAttributes() == null);
    }
Provides an attribute-based comparison (no ID comparison) - incurred <em>only</em> when 'this' or the
session object being compared for equality do not have a session id.

@param ss the SimpleSession instance to compare for equality.
@return true if all the attributes, except the id, are equal to this object's attributes.
@since 1.0
core/src/main/java/org/apache/shiro/session/mgt/SimpleSession.java