2012-10-04 34 views
8

Estoy usando Spring Security y me pregunto cómo puedo implementar la redirección después de un inicio de sesión exitoso en la página fuente si esa página contiene # (hash).Redirigir a la página que contiene el signo # (hash) después de iniciar sesión

Ahora uso always-use-default-target="false" y funciona bien en URL tipo de: /path/to/page/.

Pero cuando la URL se convierte en #/path/to/page no hace ninguna redirección.

¿Hay alguna manera de arreglarlo?

+0

puede proporcionar rutas de ejemplo –

+0

Lo hice en la pregunta:/ruta/a/página/y #/ruta/a/página – nKognito

+0

[No se puede usar hash en el lado del servidor] (http: // stackoverflow. com/questions/317760/how-to-get-url-hash-from-server-side). – Xaerxess

Respuesta

11

Aquí está la solución utilicé al final:

$(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; 
    }); 
}); 

Este fragmento addes el hash al atributo de acción del formulario de autorización y la primavera se redirige a la URL del tipo: #/path/to/page sin ningún problema.

+2

Esto funciona muy bien si se usa angular-js con un backend de resorte. ¡Gracias! –

2

Tal vez esta es la vieja pregunta, pero durante mi investigación reciente sobre este tema, encontré que el problema es común y todavía existe (especialmente en el caso de aplicaciones de front-end AngularJS modernas con seguridad de back-end). Me gustaría compartir mi solución contigo.

En la página de inicio de sesión, por ejemplo, /login.html, puso siguiente código antes de la etiqueta </body>:

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

Nota (1): btoa() función funciona en IE> = 10 (http://www.w3schools.com/jsref/met_win_btoa.asp), para los navegadores más antiguos use el equivalente de jQuery.

Nota (2): El cifrado de la # parte de la URL es necesario, ya que puede contener caracteres especiales, que no se pueden almacenar en la cadena de valor de la cookie.

Desde el lado del servidor tiene que modificar onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) método de clase que implementa la interfaz AuthenticationSuccessHandler.

En mi caso, simplemente extiendo la clase SavedRequestAwareAuthenticationSuccessHandler y anulo el método onAuthenticationSuccess usando su código original. Luego obtengo el valor de cookie hashPart de la solicitud, lo decodifico y lo agrego a la URL de redireccionamiento resuelto. Mi siguiente fragmento de código:

@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); 
} 

Por último, simplemente inyectar su clase de controlador éxito a la configuración de la primavera de Seguridad, como se describe en: https://stackoverflow.com/a/21100458/3076403

Estoy deseando a sus comentarios u otras soluciones a este problema.

Cuestiones relacionadas