code: @Override
      public <ATTRIBUTE> OptionalThing<ATTRIBUTE> getAttribute(String key, Class<ATTRIBUTE> attributeType) {
          assertArgumentNotNull("key", key);
          final OptionalThing<ATTRIBUTE> foundShared = findAttributeInShareStorage(key, attributeType);
          if (foundShared.isPresent()) {
              return foundShared;
          }
          if (isSuppressHttpSession()) { // needs to check because it cannot use attribute name list in message
              return OptionalThing.ofNullable(null, () -> {
                  final String msg = "Not found the session attribute in shared storage by the string key: " + key;
                  throw new SessionAttributeNotFoundException(msg);
              });
          }
          final boolean withShared = true; // automatically synchronize with shared storage
          return findHttpAttribute(key, attributeType, withShared);
      }
docs: ==================