2010-05-26 13 views
5

En Spring MVC 2.5 con Jetty, probablemente con cualquier contenedor de servlets, quiero redirigir a un sitio externo usando RedirectView mediante el "redirect" mágico: "prefijo para el nombre de vista en ModelAndView.Spring MVC and Jetty: Impedir que jsessionid se use en RedirectView al redireccionar al sitio externo

Lamentablemente, RedirectView utiliza response.encodeRedirectURL(), por lo que mi ID de sesión (otherwiese wanted) se anexa a la URL. No es solo un riesgo de seguridad llevar el ID de la sesión al sitio externo, la cadena "; jsessionid = gagnbaba" también se puede interpretar como parte de ContextPath/PathInfo en el otro sitio, lo que da como resultado una URL incorrecta.

Cualquier opción "springish" que no sea implementar mi propia ExternalRedirectView ... y también hackear ViewResolver para interpretar un prefijo "externalRedirect:"? (Que requieren las cookies no es una opción.)

Moritz

+0

'RedirectView' no llama a' response.encodeURL() ', llama' response.encodeRedirectURL() ' – skaffman

+0

a la derecha, gracias. Corregido eso en la pregunta. –

+0

¿Cómo implementaría 'ExternalRedirectView' de forma diferente al estándar' RedirectView'? – skaffman

Respuesta

2

Ahora aquí es ExternalRedirectView como se había planeado en mi comentario anterior ... lo hizo de esa manera.

import java.io.IOException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.view.RedirectView; 

/** variant of RedirectView, will not add a session id to the url 
*/ 
public class ExternalRedirectView extends RedirectView { 
    public ExternalRedirectView(String url, boolean contextRelative) { 
     super(url, contextRelative); 
    } 

    /** copied from @link{RedirectView#sendRedirect} and removed calls to 
    * reponse.encodeRedirectURL() 
    */ 
    @Override 
    protected void sendRedirect(HttpServletRequest request, 
      HttpServletResponse response, String targetUrl, 
      boolean http10Compatible) throws IOException { 
     if (http10Compatible) { 
      // Always send status code 302. 
      response.sendRedirect(targetUrl); 
     } 
     else { 
      // Correct HTTP status code is 303, in particular for POST requests. 
      response.setStatus(303); 
      response.setHeader("Location", targetUrl); 
     } 
    } 
} 

también ya tenía mi propia ViewResolver en la que he añadido la funcionalidad de la nueva externalRedirect: magia nombre vier prefijo, que ahora se lee:

class MyViewResolver extends AbstractCachingViewResolver implements BeanFactoryAware { 
[...] 
    private static final String EXTERNAL_REDIRECT_URL_PREFIX = "externalRedirect:"; 
[...] 
    @Override 
    protected View loadView(String viewName, Locale locale) throws Exception { 
     View view; 
     if (viewName.startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX)) 
     { 
      view = new RedirectView(viewName.substring(UrlBasedViewResolver.REDIRECT_URL_PREFIX.length()), true); 
     } 
     else if (viewName.startsWith(EXTERNAL_REDIRECT_URL_PREFIX)) 
     { 
      view = new ExternalRedirectView(viewName.substring(EXTERNAL_REDIRECT_URL_PREFIX.length()), true); 
     } 
     else 

[...] Gracias a todos quien leyó esto y lo pensó.

Cuestiones relacionadas