2012-10-04 5 views
8

I Spring Security bin mit und frage mich, wie ich die Umleitung nach succesfull Login auf der Quellseite implementieren kann, wenn die Seite # (hash) Zeichen enthält.auf der Seite mit # (Raute) Zeichen nach dem Login

Jetzt verwende ich always-use-default-target="false" und es funktioniert gut auf URL Art von: /path/to/page/.

Aber wenn die URL zu #/path/to/page geworden ist es keine Umleitungen machen.

Gibt es eine Möglichkeit, es zu beheben? Hier

+0

können Sie Beispielpfade angeben –

+0

Ich tat es in der Frage:/Pfad/zu/Seite/und #/Pfad/zu/Seite – nKognito

+0

[Sie können Hash auf Serverseite nicht verwenden] (http: // stackoverflow. com/questions/317760/how-to-get-URL-Hash-von-Server-Seite). – Xaerxess

Antwort

11

ist die Lösung, die ich am Ende verwendet:

$(document).ready(function(){ 
    $('#auth-form').submit(function() { 
    var el = $(this); 
    var hash = window.location.hash; 
    if (hash) el.prop('action', el.prop('action') + '#' + unescape(hash.substring(1))); 
    return true; 
    }); 
}); 

Dieser Code-Schnipsel addes die Hash-to-Action-Attribut des Vollmachtsformulars und Spring leiten Sie an die URL der Art: #/path/to/page ohne Probleme.

+2

Das funktioniert gut, wenn Sie angular-js mit einem Spring-Backend verwenden. Vielen Dank! –

2

Vielleicht ist dies die alte Frage, aber während meiner jüngsten Forschung in diesem Thema, fand ich, dass das Problem häufig ist und immer noch (vor allem im Falle von modernen AngularJS Front-End-Anwendungen mit Back-End-Sicherheit). Ich möchte meine Lösung mit Ihnen teilen.

auf der Anmeldeseite, zB /login.html, folgenden Code setzt vor dem </body> tag:

<script type="text/javascript"> 
    var hash = window.location.hash; 
    document.cookie="hashPart=" + window.btoa(hash); 
</script> 

Anmerkung (1): btoa() Funktion funktioniert in IE> = 10 (http://www.w3schools.com/jsref/met_win_btoa.asp), Für ältere Browser verwenden Sie jQuery-Äquivalent.

Anmerkung (2): Die Verschlüsselung des # Teils der URL ist notwendig, da es Sonderzeichen enthält, das nicht erlaubt ist in Cookie-Wert Zeichenfolge gespeichert werden.

Von der Serverseite müssen Sie onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) Methode der Implementierung der Klasse AuthenticationSuccessHandler Schnittstelle ändern.

In meinem Fall erweitere ich einfach die Klasse SavedRequestAwareAuthenticationSuccessHandler und überschreibe die onAuthenticationSuccess Methode mit ihrem ursprünglichen Code. Dann erhalte ich den hashPart Cookie-Wert aus der Anfrage, dekodiere ihn und füge der aufgelösten Weiterleitungs-URL hinzu. Mein Code-Fragment:

@Override 
public void onAuthenticationSuccess(HttpServletRequest request, 
     HttpServletResponse response, Authentication authentication) 
     throws ServletException, IOException { 

    // ... copy/paste original implementation here, until ... 

    // Use the DefaultSavedRequest URL 
    String targetUrl = savedRequest.getRedirectUrl(); 

    for (Cookie cookie : req.getCookies()) { 
     if (cookie.getName().equals("hashPart")) { 
      targetUrl += new String(Base64Utils.decodeFromString(cookie.getValue())); 
      cookie.setMaxAge(0); // clear cookie as no longer needed 
      response.addCookie(cookie); 
      break; 
     } 
    } 

    getRedirectStrategy().sendRedirect(request, response, targetUrl); 
} 

schließlich nur Ihren Erfolg Handler-Klasse zu Ihrer Konfiguration Spring Security injizieren, wie beschrieben in: https://stackoverflow.com/a/21100458/3076403

Ich freue mich auf Ihre Kommentare oder andere Lösungen für dieses Problem.

Verwandte Themen