Управление жизненным циклом файлов cookie в сервлете Ktor 0.9.0

У меня проблемы с удалением файла cookie, установленного серверным приложением Ktor 0.9.0. Может быть, я не знаю, как это сделать правильно, или есть недостаток в рамках Ktor.

Создание и удаление файлов cookie не проблема сама по себе, но для удаления cookie я должен использовать тот же путь, который хранится в файле cookie в браузере клиента. Ктор позволил мне контролировать путь с созданием файлов cookie. Вот моя конфигурация:

install(Sessions) { cookie<MySession>(sessionMarker) { cookie.duration = cookieDuration cookie.path = "/myWebapp" transform(SessionTransportTransformerMessageAuthentication(sessionKey)) } } 

На странице входа /myWebapp/page/login я создаю файл cookie, который затем отправляется клиенту, и он перемещается вперед и назад для остальных запросов, отправленных в веб-приложение:

 call.sessions.set(MySession([some data class arguments])) 

/myWebapp cookie показывает путь /myWebapp при проверке на клиенте. По умолчанию будет /myWebapp/page потому что это путь к странице входа, но путь берется из конфигурации cookie, показанной выше. Все хорошо до сих пор.

В конце концов пользователь хочет выйти из системы через запрос POST на страницу входа:

 call.sessions.clear<MySession>() 

Проблема здесь в том, что я не нашел способ контролировать путь файла cookie. Поскольку страница входа /myWebapp/page/login отправляет истекший файл cookie обратно клиенту для другого пути (его собственный /myWebapp/page ), исходный файл cookie не удаляется ( /myWebapp/page ! = /myWebapp ).

Как я могу контролировать путь файла cookie в Ktor 0.9.0 при попытке удалить его?

Я знаю, как обойти это: создав файл cookie с тем же путем, откуда я его удалю. Но это не то, что я хочу (есть другие пути в веб-приложениях, например /myWebapp/others которые должны быть использованы в /myWebapp/others cookie). Наличие способности контролировать путь файла cookie во время создания не имеет смысла тогда.

Я думаю, вы могли бы попытаться создать свой собственный SessionTransportCookie.

Если вы видите глубже в методе cookie<MySession>(sessionMarker) вы найдете этот код:

 inline fun <reified S : Any> Sessions.Configuration.cookie(name: String, block: CookieSessionBuilder<S>.() -> Unit): Unit = cookie(name, S::class, block) inline fun <S : Any> Sessions.Configuration.cookie(name: String, sessionType: KClass<S>, block: CookieSessionBuilder<S>.() -> Unit) { val builder = CookieSessionBuilder(sessionType).apply(block) val transport = SessionTransportCookie(name, builder.cookie, builder.transformers) val tracker = SessionTrackerByValue(sessionType, builder.serializer) val provider = SessionProvider(name, sessionType, transport, tracker) register(provider) } 

Важная строка здесь создает сеансовый транспортный файл cookie по строке: SessionTransportCookie(name, builder.cookie, builder.transformers)

Давайте посмотрим глубже в SessionTransportCookie :

 class SessionTransportCookie(val name: String, val configuration: CookieConfiguration, val transformers: List<SessionTransportTransformer> ) : SessionTransport { override fun receive(call: ApplicationCall): String? { return transformers.transformRead(call.request.cookies[name]) } override fun send(call: ApplicationCall, value: String) { val now = LocalDateTime.now() val expires = now.plus(configuration.duration) val maxAge = configuration.duration[ChronoUnit.SECONDS].toInt() val cookie = Cookie(name, transformers.transformWrite(value), configuration.encoding, maxAge, expires, configuration.domain, configuration.path, configuration.secure, configuration.httpOnly, configuration.extensions ) call.response.cookies.append(cookie) } override fun clear(call: ApplicationCall) { call.response.cookies.appendExpired(name) } } class CookieConfiguration { var duration: TemporalAmount = Duration.ofDays(7) var encoding: CookieEncoding = CookieEncoding.URI_ENCODING var domain: String? = null var path: String? = null var secure: Boolean = false var httpOnly: Boolean = false val extensions: MutableMap<String, String?> = mutableMapOf() } 

Итак, как вы видите, в этом классе у вас есть все возможности для настройки вашей cookie send/clear logic.