2017-11-14 16 views
3

Ktor 0.9.0サーバー側アプリケーションで設定されたクッキーの削除に問題があります。たぶん私はそれを正しい方法でやるか、Ktorフレームワークに抜けがあるか分からないかもしれません。Ktor 0.9.0サーブレットでのCookieライフサイクルの制御

クッキーの作成と削除自体は問題ではありませんが、クッキーを削除するには、クライアントブラウザにクッキーと同じパスを使用する必要があります。 Ktorはクッキーの作成を使ってパスを制御できます。ここに私の設定です:

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

ログインページ/myWebapp/page/loginで、私はその後、クライアントに送信されたクッキーを作成し、それをWebアプリケーションに送信される要求の残りの部分を前後に移動:

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

クッキーは、クライアント上で検査されると、パス/myWebappを表示します。デフォルトは/myWebapp/pageです。これはログインページのパスですが、パスは上記のCookie設定から取得されるためです。今まではすべてが順調です。

は、最終的にユーザーがログインページへのPOSTリクエストを経由してログアウトしたい:

call.sessions.clear<MySession>() 

ここでの問題は、私はクッキーのパスを制御する方法を見つけていませんでしたということです。ログインページ/myWebapp/page/loginは期限切れのクッキーを別のパス(自分自身の/myWebapp/page)のためにクライアントに送り返しているため、元のクッキーは削除されません(/myWebapp/page!= /myWebapp)。

Ktor 0.9.0でクッキーのパスを削除しようとするとどうすれば制御できますか?

私はそれを回避する方法を知っています:それを削除する場所から同じパスでクッキーを作成します。しかし、それは私が欲しいものではありません(/myWebapp/othersのようなウェブアプリケーション内の他のパスがクッキーを使用する必要があります)。作成中にクッキーのパスを制御する機能を持つことは意味がありません。

答えて

1

あなた自身のカスタム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) 
} 

ここで重要な行は行でセッション輸送クッキーを作成している: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() 
} 

ご覧のとおり、このクラスでは、すべての可能性があります。send/clearロジック。

関連する問題