2009-08-07 10 views
5

Estoy trabajando en una aplicación web que usa Jersey. Estoy tratando de implementar un tipo de cosas de obtener después de publicar usando un URIBuilder y una respuesta verOtros. El objetivo es redirigir al mismo URI en el que el navegador ya está activado, pero forzar un GET. Funciona un poco como esto:Jersey - Redirección con Get Not Put, causa un bucle de redirección

  1. petición llega a través de PUT
  2. solicitud PUT procesa
  3. respuesta SeeOther volvió

Qué debe ocurrir es que el navegador recoge el 303 Ver Otros y realiza un GET en el URI que recibe. Desafortunadamente, lo que está sucediendo es que realiza un PUT en el URI en su lugar (hasta donde puedo decir) y el PUT lo envía de vuelta al paso 1. anterior, lo que causa un bucle de redirección.

¿Alguna idea de lo que está mal aquí?

private Response giveSeeOther(){ 
    /*Get the base URI builder*/ 
    final UriBuilder uriBuilder = m_uriInfo.getBaseUriBuilder(); 

    /* Some stuff to create the URI */ 
    final Map<String, Object> parameterMap = new HashMap<String, Object>(); 
    parameterMap.put("uid", getUid()); 

    final URI redirectUri = uriBuilder.path(SomeObject.class). 
            path(SomeObject.class, "get"). 
            buildFromMap(parameterMap); 

    /* See Other (303) */ 
    return Response.seeOther(redirectUri).build();} 

Ese es el código para el ver otro método. No estoy seguro de qué otro código podría querer ver, pero avíseme.

+0

Su código para el 'seeOther' se ve bien (no entiendo lo que le hace UriBuilder con las clases). Una cosa que debes comprobar es que llamas 'giveSeeOther()' solo desde un manejador PUT y no desde un manejador genérico. También me gustaría saber con qué usuarios-agentes ves este comportamiento. – Guss

Respuesta

8

En su lugar, necesita utilizar un código de respuesta HTTP 301.

Mediante el uso de 303, su solicitud POST se mantiene, y se redirige en consecuencia. Al usar 301, su solicitud es "Movida permanentemente" a través de GET.

Para otros lectores que podrían preguntarse por qué alguien quiere hacer esto, es para evitar que el usuario envíe sus datos POST más de una vez utilizando la función "Recargar" de su navegador web (qué usuarios con problemas de comunicación podridos) a menudo lo hacen) para volver a cargar la página de "agradecimiento" que puede no haberse cargado por completo.

Sugerencia: Cuando redirige de esta manera, si no está utilizando cookies para asegurar que la información llegue a su página de "agradecimiento", entonces deberá agregar uno o más parámetros a su solicitud de la misma manera un formulario GET regular lo hará. Por ejemplo, si el número de orden de ID es 82838, se puede pasar a lo largo de su "página de agradecimiento" de esta manera:

http://www.example.com/order/thank-you.pl?orderid=82838

Hay problemas potenciales obvias de seguridad con este que se resuelven fácilmente por tener su código de página "gracias" compruebe que la ID del pedido en realidad pertenece al usuario que está conectado actualmente antes de que muestre el estado del pedido (supongo que desea incluir información de estado del pedido en esa página de "agradecimiento"; en este caso, también Es bueno incluir un botón "Actualizar" {o enlace} para que el usuario verifique el estado del pedido si es algo que progresa a corto plazo en una serie de pasos).

Espero que sea útil para usted.