Cookie Store
A função ctx.cookieStore() fornece um conveniente caminho para compartilhar informações entre handlers, request ou até mesmo servidores:
ctx.cookieStore(key, value); // store any type of value
ctx.cookieStore(key); // read any type of value
ctx.clearCookieStore(); // clear the cookie-store
O cookieStore funciona desta maneira:
1. O primeiro handler que combina a entrada do request que irá popular o cookie-store-map com dados guardados no cookie (caso exista).
2. Este map pode agora ser utilizado como um estado entre handlers no mesmo ciclo de request, bastante parecido com o ctx.attribute().
3. No fim do ciclo do request, o cookie-store-map é serializado, base64-encoded e escrito no response como um cookie. Isto permite você dividir o map entre requests e servers (no caso você está executando múltiplos servidores por trás de um load-balancer)
Exemplo:
- Java
- Kotlin
serverOneApp.post("/cookie-storer") { ctx ->
ctx.cookieStore("string", "Hello world!");
ctx.cookieStore("i", 42);
ctx.cookieStore("list", Arrays.asList("One", "Two", "Three"));
}
serverTwoApp.get("/cookie-reader") { ctx -> // runs on a different server than serverOneApp
String string = ctx.cookieStore("string")
int i = ctx.cookieStore("i")
List<String> list = ctx.cookieStore("list")
}
serverOneApp.post("/cookie-storer") { ctx ->
ctx.cookieStore("string", "Hello world!")
ctx.cookieStore("i", 42)
ctx.cookieStore("list", listOf("One", "Two", "Three"))
}
serverTwoApp.get("/cookie-reader") { ctx -> // runs on a different server than serverOneApp
val string = ctx.cookieStore<String>("string")
val i = ctx.cookieStore<Int>("i")
val list = ctx.cookieStore<List<String>>("list")
}
Desde que o cliente guarda o cookie, o get request para o serverTwoApp irá ser capaz de recuperar as informações que foram passadas via post para serverOneApp.
Lembre-se que os cookies têm no máximo 4kb.
Context extensions
Context extensions fornece para o desenvolvedor Java uma maneira de estender o objeto Context.
Um dos mais populares recursos do Kotlin é a extension functions. Quando trabalhar com um objeto que não seja Java, você muitas vezes termina fazendo MyUtil.action(object, …).
Se você, por exemplo, quiser serializar um objeto e configurar o resultado no Context, você pode fazer:
app.get("/", ctx -> MyMapperUtil.serialize(ctx, myMapper, myObject)); // three args, what happens where?
Com context extensions você pode adicionar extensões no context:
app.get("/", ctx -> ctx.use(MyMapper.class).serialize(object)); // use MyMapper to serialize object
Context extensions deve ser adicionado antes de ser utilizado, isto pode tipicamente ser feito primeiro (before) no filtro do seu app:
app.before(ctx -> ctx.register(MyMapper.class, new MyMapper(ctx, otherDependency));
WebSockets
Javalin é muito intuitivo para utilizar o WebSockets. Você declara um endpoint com um caminho e configura um diferente event handlers no lambda:
- Java
- Kotlin
app.ws("/websocket/:path", ws -> {
ws.onConnect(ctx -> System.out.println("Connected"));
});
app.ws("/websocket/:path") { ws ->
ws.onConnect { ctx -> println("Connected") }
}
Há no total cinco eventos suportados:
ws.onConnect(WsConnectContext)
ws.onError(WsErrorContext)
ws.onClose(WsCloseContext)
ws.onMessage(WsMessageContext)
ws.onBinaryMessage(WsBinaryMessageContext)
Os diferentes sabores de WsContext expõe diferentes coisas, como por exemplo, WsMessageContext tem o método .message() o qual dá a mensagem que o cliente mandou. As diferenças entre os diferentes contexts é pequena.





Deixe um comentário