2010-04-09 35 views
10

Necesito redirigir a un usuario a un sitio externo a través de una solicitud POST.¿Una buena forma de redireccionar con una solicitud POST?

La única opción que descubrí es hacerlo enviar un formulario a través de JavaScript.


¿Alguna idea?

+0

Puede aclarar qué quiere decir con eso? ¿Desea enviar/reenviar los datos POST a otro servidor? ¿Desea que el navegador de los usuarios lo redireccione después de que PUBLICÓ una solicitud? Algo más...? – deceze

Respuesta

1

El uso de un formulario es probablemente su única opción, ya que los enlaces, las redirecciones HTTP y <meta http-equiv="refresh" > solo harán que el navegador cargue otra URL utilizando el método GET.

Sin embargo, no necesariamente tiene que usar JavaScript para enviar un formulario. Si alguna interacción del usuario es aceptable, puede usar un formulario con algunos campos <input type="hidden"> y dejar que el usuario presione el botón Enviar.

Es posible que también desee asegurarse de que la página a la que está redirigiendo no acepte los parámetros GET. Algunos scripts aceptan tanto GET como POST indiscriminadamente.

2

Javascript es la única forma (para hacerlo automáticamente). Simplemente no puede redirigir una solicitud POST a través de los métodos estándar http. ¿Estás seguro de que GET no es una opción aquí?

2

Simplemente configure la URL de acción del formulario HTML en el sitio externo en particular.

He aquí un SSCCE, simplemente copy'n'paste'n'run que:

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2604530</title> 
    </head> 
    <body> 
     <form action="http://stackoverflow.com/questions/2604530/answer/submit" method="post"> 
      <textarea name="post-text"></textarea> 
      <input type="submit" value="Post Your Answer"> 
     </form> 
    </body> 
</html> 

Vas a ver que Stackoverflow tiene una buena protección CSRF;)

22

No es muy claro lo que quiere decir, así que vamos a tomar unos escenarios:

  1. usuario debe enviar formulario a un servidor que no sea su propia

    fácil, basta con especificar el destino como la acción del formulario:

    <form action="http://someotherserver.com" method="post"> 
    
  2. usuario debe ser redirigido después de un POST satisfactoria presentar

    fácil, aceptar y procesar los datos POST, como de costumbre, luego responde con un encabezado de redirección 302 o 303.

  3. usuario debe publicar datos en el servidor y, después de la validación, que desea publicar esos datos a otro servidor

    poco complicado, pero tres opciones:

    • El servidor acepta el cargo datos y mientras el usuario espera una respuesta, establece una conexión con otro servidor, POSTING los datos, recibe una respuesta y luego devuelve una respuesta al usuario.
    • Responde con un redireccionamiento 307, lo que significa que el usuario debe intentar la misma solicitud en otra dirección. Teóricamente significa que el navegador debe enviar los mismos datos a otro servidor. No estoy seguro de lo bien que esto es compatible, pero cualquier navegador que entienda HTTP1.1 debería poder hacerlo. AFAIA no se usa tan a menudo en la práctica.
      PS: La especificación dice que un 307 POST redirecciona debe ser reconocido al menos por el usuario. Por desgracia, aparentemente ningún navegador se está apegando a la especificación aquí. IE simplemente repite la solicitud (por lo que funciona para sus propósitos), pero Firefox, Safari y Opera parecen descartar los datos POST. Por lo tanto, esta técnica lamentablemente no es confiable.
    • Utilice la técnica n. ° 1 combinada con los campos de formularios ocultos, agregando un paso intermedio.

Ver aquí para una lista de todas las opciones de redirección HTTP: http://en.wikipedia.org/wiki/Http_status_codes#3xx_Redirection

+0

Sé que 307 redireccionamientos en FF19 harán que aparezca el cuadro de diálogo de confirmación. No estoy seguro acerca de las versiones anteriores. – rahulmohan

Cuestiones relacionadas