{"id":851,"date":"2020-04-20T09:34:08","date_gmt":"2020-04-20T12:34:08","guid":{"rendered":"https:\/\/micheladrianomedeiros.com.br\/blog\/?p=851"},"modified":"2020-04-20T09:37:17","modified_gmt":"2020-04-20T12:37:17","slug":"javalin-3-3","status":"publish","type":"post","link":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/","title":{"rendered":"Javalin 3 #3"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#WsBefore\" >#WsBefore<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#WsEndpoint\" >#WsEndpoint<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#WsAfter\" >#WsAfter<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#WsContext\" >#WsContext<\/a><\/li><\/ul><\/nav><\/div>\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"WsBefore\"><\/span><strong>#WsBefore<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>O app.wsBefore adiciona um handler que executa antes de um WebSocket handler. Voc\u00ea pode ter v\u00e1rios before-handlers como um WebSocket endpoint, e todos os eventos s\u00e3o suportados.<\/p>\n\n\n\n<link rel=\"stylesheet\" href=\"https:\/\/javalin.io\/css\/main.css\">\n<script src=\"https:\/\/javalin.io\/js\/scripts.js\"><\/script>\n   \n <style>\/* Styles that affect the length of the document *\/\np code,\nli code {\n    font-size: 90%;\n    letter-spacing: -0.5px;\n    border: 1px solid #ccc;\n    padding: 1px 3px;\n}\n\n.multitab-code pre {\n    margin-top: 0;\n    border-radius: 0 0 5px 5px;\n}\n\n.multitab-code div[data-tab] {\n    display: none;\n}\n<\/style>\n\n<div class=\"multitab-code\" data-tab=\"1\">\n<ul>\n    <li data-tab=\"1\">Java<\/li>\n    <li data-tab=\"2\">Kotlin<\/li>\n<\/ul>\n<div data-tab=\"1\">\n    <div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">app<\/span><span class=\"o\">.<\/span><span class=\"na\">wsBefore<\/span><span class=\"o\">(<\/span><span class=\"n\">ws<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n    <span class=\"c1\">\/\/ runs before all WebSocket requests<\/span>\n<span class=\"o\">});<\/span>\n<span class=\"n\">app<\/span><span class=\"o\">.<\/span><span class=\"na\">wsBefore<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/path\/*\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">ws<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n    <span class=\"c1\">\/\/ runs before websocket requests to \/path\/*<\/span>\n<span class=\"o\">});<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/div>\n<div data-tab=\"2\">\n    <div class=\"language-kotlin highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">wsBefore<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ws<\/span> <span class=\"p\">-&gt;<\/span>\n    <span class=\"c1\">\/\/ runs before all WebSocket requests<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">wsBefore<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/path\/*\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ws<\/span> <span class=\"p\">-&gt;<\/span>\n    <span class=\"c1\">\/\/ runs before websocket requests to \/path\/*<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"WsEndpoint\"><\/span><strong>#WsEndpoint<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>Um WebSocket endpoint \u00e9 declarado com app.ws(path, handler). WebSocket handlers requerem um \u00fanico paths.<\/p>\n\n\n\n<link rel=\"stylesheet\" href=\"https:\/\/javalin.io\/css\/main.css\">\n<script src=\"https:\/\/javalin.io\/js\/scripts.js\"><\/script>\n   \n <style>\/* Styles that affect the length of the document *\/\np code,\nli code {\n    font-size: 90%;\n    letter-spacing: -0.5px;\n    border: 1px solid #ccc;\n    padding: 1px 3px;\n}\n\n.multitab-code pre {\n    margin-top: 0;\n    border-radius: 0 0 5px 5px;\n}\n\n.multitab-code div[data-tab] {\n    display: none;\n}\n<\/style>\n\n<div class=\"multitab-code\" data-tab=\"1\">\n<ul>\n    <li data-tab=\"1\">Java<\/li>\n    <li data-tab=\"2\">Kotlin<\/li>\n<\/ul>\n<div data-tab=\"1\">\n    <div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">app<\/span><span class=\"o\">.<\/span><span class=\"na\">ws<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/websocket\/:path\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">ws<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n    <span class=\"n\">ws<\/span><span class=\"o\">.<\/span><span class=\"na\">onConnect<\/span><span class=\"o\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Connected\"<\/span><span class=\"o\">));<\/span>\n    <span class=\"n\">ws<\/span><span class=\"o\">.<\/span><span class=\"na\">onMessage<\/span><span class=\"o\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n        <span class=\"nc\">User<\/span> <span class=\"n\">user<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">message<\/span><span class=\"o\">(<\/span><span class=\"nc\">User<\/span><span class=\"o\">.<\/span><span class=\"na\">class<\/span><span class=\"o\">);<\/span> <span class=\"c1\">\/\/ convert from json<\/span>\n        <span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">send<\/span><span class=\"o\">(<\/span><span class=\"n\">user<\/span><span class=\"o\">);<\/span> <span class=\"c1\">\/\/ convert to json and send back<\/span>\n    <span class=\"o\">});<\/span>\n    <span class=\"n\">ws<\/span><span class=\"o\">.<\/span><span class=\"na\">onBinaryMessage<\/span><span class=\"o\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Message\"<\/span><span class=\"o\">))<\/span>\n    <span class=\"n\">ws<\/span><span class=\"o\">.<\/span><span class=\"na\">onClose<\/span><span class=\"o\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Closed\"<\/span><span class=\"o\">));<\/span>\n    <span class=\"n\">ws<\/span><span class=\"o\">.<\/span><span class=\"na\">onError<\/span><span class=\"o\">(<\/span><span class=\"n\">ctx<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"nc\">System<\/span><span class=\"o\">.<\/span><span class=\"na\">out<\/span><span class=\"o\">.<\/span><span class=\"na\">println<\/span><span class=\"o\">(<\/span><span class=\"s\">\"Errored\"<\/span><span class=\"o\">));<\/span>\n<span class=\"o\">});<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/div>\n<div data-tab=\"2\">\n    <div class=\"language-kotlin highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">ws<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/websocket\/:path\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ws<\/span> <span class=\"p\">-&gt;<\/span>\n    <span class=\"n\">ws<\/span><span class=\"p\">.<\/span><span class=\"nf\">onConnect<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ctx<\/span> <span class=\"p\">-&gt;<\/span> <span class=\"nf\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Connected\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\n    <span class=\"n\">ws<\/span><span class=\"p\">.<\/span><span class=\"nf\">onMessage<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ctx<\/span> <span class=\"p\">-&gt;<\/span>\n        <span class=\"kd\">val<\/span> <span class=\"py\">user<\/span> <span class=\"p\">=<\/span> <span class=\"n\">ctx<\/span><span class=\"p\">.<\/span><span class=\"n\">message<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">User<\/span><span class=\"p\">&gt;();<\/span> <span class=\"c1\">\/\/ convert from json<\/span>\n        <span class=\"n\">ctx<\/span><span class=\"p\">.<\/span><span class=\"nf\">send<\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">);<\/span> <span class=\"c1\">\/\/ convert to json and send back<\/span>\n    <span class=\"p\">}<\/span>\n    <span class=\"n\">ws<\/span><span class=\"p\">.<\/span><span class=\"nf\">onBinaryMessage<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ctx<\/span> <span class=\"p\">-&gt;<\/span> <span class=\"nf\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Message\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\n    <span class=\"n\">ws<\/span><span class=\"p\">.<\/span><span class=\"nf\">onClose<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ctx<\/span> <span class=\"p\">-&gt;<\/span> <span class=\"nf\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Closed\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\n    <span class=\"n\">ws<\/span><span class=\"p\">.<\/span><span class=\"nf\">onError<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ctx<\/span> <span class=\"p\">-&gt;<\/span> <span class=\"nf\">println<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Errored\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"WsAfter\"><\/span><strong>#WsAfter<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>O app.wsAfter adiciona um handler que executa depois de um WebSocket handler. Voc\u00ea pode ter v\u00e1rios after-handlers como um WebSocket endpoint, e todos os eventos s\u00e3o suportados.<\/p>\n\n\n\n<link rel=\"stylesheet\" href=\"https:\/\/javalin.io\/css\/main.css\">\n<script src=\"https:\/\/javalin.io\/js\/scripts.js\"><\/script>\n   \n <style>\/* Styles that affect the length of the document *\/\np code,\nli code {\n    font-size: 90%;\n    letter-spacing: -0.5px;\n    border: 1px solid #ccc;\n    padding: 1px 3px;\n}\n\n.multitab-code pre {\n    margin-top: 0;\n    border-radius: 0 0 5px 5px;\n}\n\n.multitab-code div[data-tab] {\n    display: none;\n}\n<\/style>\n<div class=\"multitab-code\" data-tab=\"1\">\n<ul>\n    <li data-tab=\"1\">Java<\/li>\n    <li data-tab=\"2\">Kotlin<\/li>\n<\/ul>\n<div data-tab=\"1\">\n    <div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">app<\/span><span class=\"o\">.<\/span><span class=\"na\">wsAfter<\/span><span class=\"o\">(<\/span><span class=\"n\">ws<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n    <span class=\"c1\">\/\/ runs after all WebSocket requests<\/span>\n<span class=\"o\">});<\/span>\n<span class=\"n\">app<\/span><span class=\"o\">.<\/span><span class=\"na\">wsAfter<\/span><span class=\"o\">(<\/span><span class=\"s\">\"\/path\/*\"<\/span><span class=\"o\">,<\/span> <span class=\"n\">ws<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"o\">{<\/span>\n    <span class=\"c1\">\/\/ runs after websocket requests to \/path\/*<\/span>\n<span class=\"o\">});<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/div>\n<div data-tab=\"2\">\n    <div class=\"language-kotlin highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">wsAfter<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ws<\/span> <span class=\"p\">-&gt;<\/span>\n    <span class=\"c1\">\/\/ runs after all WebSocket requests<\/span>\n<span class=\"p\">}<\/span>\n<span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">wsAfter<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/path\/:path\"<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span> <span class=\"n\">ws<\/span> <span class=\"p\">-&gt;<\/span>\n    <span class=\"c1\">\/\/ runs after websocket requests to \/path\/*<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre><\/div>    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"WsContext\"><\/span><strong>#WsContext<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>O objeto wsContext fornece para voc\u00ea tudo o que voc\u00ea precisa para manipular um websocket-request. Ele cont\u00e9m o b\u00e1sico do websocket session e servlet-request, e m\u00e9todos convenientes para mandar mensagens para o cliente.<\/p>\n\n\n\n<link rel=\"stylesheet\" href=\"https:\/\/javalin.io\/css\/main.css\">\n<script src=\"https:\/\/javalin.io\/js\/scripts.js\"><\/script>\n   \n <style>\/* Styles that affect the length of the document *\/\np code,\nli code {\n    font-size: 90%;\n    letter-spacing: -0.5px;\n    border: 1px solid #ccc;\n    padding: 1px 3px;\n}\n\n.multitab-code pre {\n    margin-top: 0;\n    border-radius: 0 0 5px 5px;\n}\n\n.multitab-code div[data-tab] {\n    display: none;\n}\n<\/style>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">matchedPath<\/span><span class=\"o\">()<\/span>            <span class=\"c1\">\/\/ get the path used to match this request, ex \"\/path\/:param\"<\/span>\n\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">send<\/span><span class=\"o\">(<\/span><span class=\"n\">object<\/span><span class=\"o\">)<\/span>             <span class=\"c1\">\/\/ send an object as JSON (string message)<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">send<\/span><span class=\"o\">(<\/span><span class=\"n\">string<\/span><span class=\"o\">)<\/span>             <span class=\"c1\">\/\/ send a string message<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">send<\/span><span class=\"o\">(<\/span><span class=\"n\">byteBuffer<\/span><span class=\"o\">)<\/span>         <span class=\"c1\">\/\/ send a bytebuffer message<\/span>\n\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">queryString<\/span><span class=\"o\">()<\/span>            <span class=\"c1\">\/\/ get the query string<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">queryParamMap<\/span><span class=\"o\">()<\/span>          <span class=\"c1\">\/\/ get a map of the query parameters<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">queryParams<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>         <span class=\"c1\">\/\/ get query parameters by key<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">queryParam<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>          <span class=\"c1\">\/\/ get query parameter by key<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">queryParam<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"k\">default<\/span><span class=\"o\">)<\/span> <span class=\"c1\">\/\/ get query parameter (or default value)<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">queryParam<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"kd\">class<\/span><span class=\"err\">)<\/span>   <span class=\"err\">\/\/<\/span> <span class=\"nc\">get<\/span> <span class=\"n\">query<\/span> <span class=\"n\">parameter<\/span> <span class=\"n\">as<\/span> <span class=\"kd\">class<\/span>\n\n<span class=\"nc\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">pathParamMap<\/span><span class=\"o\">()<\/span>           <span class=\"c1\">\/\/ get path parameter map<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">pathParam<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>           <span class=\"c1\">\/\/ get path parameter<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">pathParam<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"kd\">class<\/span><span class=\"err\">)<\/span>    <span class=\"err\">\/\/<\/span> <span class=\"nc\">get<\/span> <span class=\"n\">path<\/span> <span class=\"n\">parameter<\/span> <span class=\"n\">as<\/span> <span class=\"kd\">class<\/span>\n\n<span class=\"nc\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">host<\/span><span class=\"o\">()<\/span>                   <span class=\"c1\">\/\/ get the host<\/span>\n\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">header<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>              <span class=\"c1\">\/\/ get request header<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">headerMap<\/span><span class=\"o\">()<\/span>              <span class=\"c1\">\/\/ get a map of the request headers<\/span>\n\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">cookie<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>              <span class=\"c1\">\/\/ get request cookie<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">cookieMap<\/span><span class=\"o\">()<\/span>              <span class=\"c1\">\/\/ get a map of all request cookies<\/span>\n\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">attribute<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">,<\/span> <span class=\"n\">value<\/span><span class=\"o\">)<\/span>    <span class=\"c1\">\/\/ set request attribute<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">attribute<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>           <span class=\"c1\">\/\/ get request attribute<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">attributeMap<\/span><span class=\"o\">()<\/span>           <span class=\"c1\">\/\/ get a map of request attributes<\/span>\n\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">sessionAttribute<\/span><span class=\"o\">(<\/span><span class=\"n\">key<\/span><span class=\"o\">)<\/span>    <span class=\"c1\">\/\/ get request session attribute (from when WebSocket upgrade was performed)<\/span>\n<span class=\"n\">ctx<\/span><span class=\"o\">.<\/span><span class=\"na\">sessionAttributeMap<\/span><span class=\"o\">()<\/span>    <span class=\"c1\">\/\/ get a map of session attributes (from when WebSocket upgrade was performed)<\/span>\n<\/code><\/pre><\/div><\/div>\n\n\n\n<p>Fonte: <a href=\"https:\/\/javalin.io\/documentation#wscontext\">https:\/\/javalin.io\/documentation#wscontext<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>#WsBefore O app.wsBefore adiciona um handler que executa antes de um WebSocket handler. Voc\u00ea pode ter v\u00e1rios before-handlers como um WebSocket endpoint, e todos os eventos s\u00e3o suportados. Java Kotlin app.wsBefore(ws -&gt; { \/\/ runs before all WebSocket requests }); app.wsBefore(&#8220;\/path\/*&#8221;, ws -&gt; { \/\/ runs before websocket requests to \/path\/* }); app.wsBefore { ws [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":618,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[57,58],"tags":[],"class_list":["post-851","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-framework","category-javalin"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.5 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Javalin 3 #3 - Viciados em Aprender<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Javalin 3 #3\" \/>\n<meta property=\"og:description\" content=\"#WsBefore O app.wsBefore adiciona um handler que executa antes de um WebSocket handler. Voc\u00ea pode ter v\u00e1rios before-handlers como um WebSocket endpoint, e todos os eventos s\u00e3o suportados. Java Kotlin app.wsBefore(ws -&gt; { \/\/ runs before all WebSocket requests }); app.wsBefore(&quot;\/path\/*&quot;, ws -&gt; { \/\/ runs before websocket requests to \/path\/* }); app.wsBefore { ws [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Viciados em Aprender\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-20T12:34:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-04-20T12:37:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2019\/12\/javalin-1-300x871.png\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"87\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"blackzig\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"blackzig\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/\"},\"author\":{\"name\":\"blackzig\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/687a6d17428a0f0e040aefbd858ebc1e\"},\"headline\":\"Javalin 3 #3\",\"datePublished\":\"2020-04-20T12:34:08+00:00\",\"dateModified\":\"2020-04-20T12:37:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/\"},\"wordCount\":128,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/687a6d17428a0f0e040aefbd858ebc1e\"},\"image\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/javalin-1-300x871.png\",\"articleSection\":[\"Framework\",\"Javalin\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/\",\"url\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/\",\"name\":\"Javalin 3 #3 - Viciados em Aprender\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/javalin-1-300x871.png\",\"datePublished\":\"2020-04-20T12:34:08+00:00\",\"dateModified\":\"2020-04-20T12:37:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/javalin-1-300x871.png\",\"contentUrl\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/javalin-1-300x871.png\",\"width\":300,\"height\":87},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/javalin-3-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Javalin 3 #3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/\",\"name\":\"Viciados em Aprender\",\"description\":\"Queremos aprender tudo o que for poss\u00edvel nesta vida.\",\"publisher\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/687a6d17428a0f0e040aefbd858ebc1e\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/687a6d17428a0f0e040aefbd858ebc1e\",\"name\":\"blackzig\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg\",\"url\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg\",\"contentUrl\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg\",\"width\":1920,\"height\":1080,\"caption\":\"blackzig\"},\"logo\":{\"@id\":\"https:\\\/\\\/micheladrianomedeiros.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.micheladrianomedeiros.com.br\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Javalin 3 #3 - Viciados em Aprender","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/","og_locale":"pt_PT","og_type":"article","og_title":"Javalin 3 #3","og_description":"#WsBefore O app.wsBefore adiciona um handler que executa antes de um WebSocket handler. Voc\u00ea pode ter v\u00e1rios before-handlers como um WebSocket endpoint, e todos os eventos s\u00e3o suportados. Java Kotlin app.wsBefore(ws -&gt; { \/\/ runs before all WebSocket requests }); app.wsBefore(\"\/path\/*\", ws -&gt; { \/\/ runs before websocket requests to \/path\/* }); app.wsBefore { ws [&hellip;]","og_url":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/","og_site_name":"Viciados em Aprender","article_published_time":"2020-04-20T12:34:08+00:00","article_modified_time":"2020-04-20T12:37:17+00:00","og_image":[{"width":300,"height":87,"url":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2019\/12\/javalin-1-300x871.png","type":"image\/png"}],"author":"blackzig","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"blackzig","Tempo estimado de leitura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#article","isPartOf":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/"},"author":{"name":"blackzig","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/#\/schema\/person\/687a6d17428a0f0e040aefbd858ebc1e"},"headline":"Javalin 3 #3","datePublished":"2020-04-20T12:34:08+00:00","dateModified":"2020-04-20T12:37:17+00:00","mainEntityOfPage":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/"},"wordCount":128,"commentCount":0,"publisher":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/#\/schema\/person\/687a6d17428a0f0e040aefbd858ebc1e"},"image":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#primaryimage"},"thumbnailUrl":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2019\/12\/javalin-1-300x871.png","articleSection":["Framework","Javalin"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/","url":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/","name":"Javalin 3 #3 - Viciados em Aprender","isPartOf":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#primaryimage"},"image":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#primaryimage"},"thumbnailUrl":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2019\/12\/javalin-1-300x871.png","datePublished":"2020-04-20T12:34:08+00:00","dateModified":"2020-04-20T12:37:17+00:00","breadcrumb":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#primaryimage","url":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2019\/12\/javalin-1-300x871.png","contentUrl":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2019\/12\/javalin-1-300x871.png","width":300,"height":87},{"@type":"BreadcrumbList","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/javalin-3-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/micheladrianomedeiros.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Javalin 3 #3"}]},{"@type":"WebSite","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/#website","url":"https:\/\/micheladrianomedeiros.com.br\/blog\/","name":"Viciados em Aprender","description":"Queremos aprender tudo o que for poss\u00edvel nesta vida.","publisher":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/#\/schema\/person\/687a6d17428a0f0e040aefbd858ebc1e"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/micheladrianomedeiros.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":["Person","Organization"],"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/#\/schema\/person\/687a6d17428a0f0e040aefbd858ebc1e","name":"blackzig","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2025\/07\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg","url":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2025\/07\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg","contentUrl":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2025\/07\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg","width":1920,"height":1080,"caption":"blackzig"},"logo":{"@id":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-content\/uploads\/2025\/07\/a7e4b18a2d7254b5cf6da7ca7f92dc71da86905bd1de486e98e3a98664e058f2.jpg"},"sameAs":["http:\/\/www.micheladrianomedeiros.com.br\/"]}]}},"_links":{"self":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts\/851","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/comments?post=851"}],"version-history":[{"count":2,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts\/851\/revisions"}],"predecessor-version":[{"id":855,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/posts\/851\/revisions\/855"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/media\/618"}],"wp:attachment":[{"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/media?parent=851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/categories?post=851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/micheladrianomedeiros.com.br\/blog\/wp-json\/wp\/v2\/tags?post=851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}