2017-10-23 5 views
0

Ich habe /logout Aktion, die auf /login umleiten sollte. /login rendert Vorlage, wo ich Flash-Nachricht aus Kontext lesen. Dies funktioniert, aber URL in Browser ist, bleibt nach wie vor "/ Logout":Wie auf URL innerhalb desselben Kontexts umleiten

router.get("/logout").handler((ctx) => { 
    if (ctx.user()!=null) { 
    ctx.clearUser() 
    //flash message 
    ctx.put("msg", "Logout succeed") 
    } 
    ctx.reroute("/login") 
}) 

Was ich will, aber url sollte "/ login" sein:

enter image description here

besser zu nutzen (?) :

ctx.response.putHeader("location", "/login").setStatusCode(302).end() 

Aber es gibt andere Kontext. Also ich habe keine Flash-Nachricht.

Wie auf /login im selben Kontext umleiten?

Upd. Frage zum mit Flash-Mitteilungen issue

+1

Der [Vert.x Proben] (https://github.com/vert-x3/vertx-examples/search?l=Java&q=setStatusCode%28302%29&type=&utf8= % E2% 9C% 93) verwenden typischerweise diesen Ansatz: 'ctx.response.putHeader (" location " , "/ login"). setStatusCode (302) .end() '. – glytching

+0

Ja, aber es beginnt eine neue Anfrage (ein anderer Kontext). Ich brauche die conext-Daten im "login" -Handler, der im "logout" -Handler geschrieben wurde. – zella

+0

Ich verpasse hier wahrscheinlich etwas, aber der Titel der Frage lautet: "Wie kann ich zu URL im selben Kontext umleiten", während Ihre späteren Updates (und Ihr letzter Kommentar) über einen neuen Kontext sprechen. – glytching

Antwort

0

Um im Zusammenhang arbeiten Sie einen Cookie auf die Umleitung mit dem Inhalt hinzufügen sollen:

// this makes the message available to the client 
ctx 
    .addCookie(Cookie.cookie("flashMessage", "Logout succeed")); 
// configure where to redirect 
ctx.response() 
    .putHeader("location", "/login"); 
// perform the redirect 
ctx.end(302); 

Dann auf der Clientseite müssen Sie ein wenig JavaScript lesen die Nachricht und führen Sie die Anzeige, wie Sie möchten. Da es keine einfache Möglichkeit, Cookies im Browser zu lesen, wenn Sie jQuery mit der Cookie-Plugin verwenden können Sie so etwas wie zu tun:

$.fn.flashMessage = function (options) { 
    var target = this; 
    options = $.extend({}, options, { timeout: 3000 }); 
    if (!options.message) { 
     options.message = getFlashMessageFromCookie(); 
     deleteFlashMessageCookie(); 
    } 
    if (options.message) { 
     if (typeof options.message === "string") { 
      target.html("<span>" + options.message + "</span>"); 
     } else { 
      target.empty().append(options.message); 
     } 
    } 

    if (target.children().length === 0) return; 

    target.fadeIn().one("click", function() { 
     $(this).fadeOut(); 
    }); 

    if (options.timeout > 0) { 
     setTimeout(function() { target.fadeOut(); }, options.timeout); 
    } 

    return this; 

    function getFlashMessageFromCookie() { 
     return $.cookie("FlashMessage"); 
    } 

    function deleteFlashMessageCookie() { 
     $.cookie("FlashMessage", null, { path: '/' }); 
    } 
}; 

Und einen Platzhalter in Ihrem HTML hinzufügen:

<div id="flash-message"></div> 

Und auslösen mag es:

$(function() { 
    $("#flash-message").flashMessage(); 
}); 
Verwandte Themen