2012-01-27 14 views
14

Estoy trabajando en una herramienta web que simplifica el trabajo que hacemos en mi oficina. Las herramientas que nos proporciona nuestro socio tienen un inicio de sesión genérico que usa todo el piso, pero se agota cada 30 minutos, lo que es molesto tener que volver a iniciar sesión todo el día.

Lo que he hecho en el pasado, fue crear un iframe oculto dentro de mi herramienta que inicia sesión al enviar un formulario oculto en la carga de la página y continuar enviando el formulario cada 30 minutos para evitar un tiempo de espera. Luego pueden enviar búsquedas a la herramienta asociada directamente desde mi herramienta (a través de otra forma visible).

Me gustaría utilizar jQuery $.post() para eliminar el iframe oculto, y hacerlo de manera que la única vez que envíe la información de inicio de sesión sea cuando se realice una búsqueda. De esta forma, no envía constantemente solicitudes cuando no está en uso, pero aún puede ejecutar una búsqueda sin tener que preocuparse por el tiempo de espera de inicio de sesión.

Parecería que la misma política de origen de ajax lo está impidiendo, por lo que en este momento solo tengo que abrir una nueva ventana con nombre, y luego enviar dos formularios ocultos en la ventana de destino uno después del otro.

El problema con esto es si la solicitud de inicio de sesión no se ha completado, la solicitud de búsqueda no se procesa y se vuelven a llevar a la página de inicio de sesión. Si cierran la ventana y vuelven a buscar, funcionará, pero esto también es molesto, solo que no tanto como la situación original.

Así que, aparte del hecho de que realmente tiene que ver la página abierta (a menos que esté en un iframe oculto) ¿cuál es la diferencia entre enviar parámetros a través del $.post() y enviar un formulario usando el método POST? Se ven idénticos en Firebug. ¿Hay alguna manera de configurar una devolución de llamada en el envío del formulario, por lo que espera a que se complete la primera solicitud antes de comenzar el segundo?

Respuesta

21

$ .post usa xmlhttprequest para enviar datos. Xhr está restringido a través de cors. Enviar una solicitud HTTP POST directa no lo es.

+0

No puedo adivinar por qué esta votación fue rechazada. Me parece correcto. +1 –

+0

Votos vacios eliminados.Pensé que el usuario estaba pidiendo una explicación * por qué * solo XHR tiene las restricciones: ese es el problema si el tema es una pregunta completa que difiere del cuerpo y la gente solo lee el tema cuidadosamente: p – ThiefMaster

+0

es una forma de enviar un resumen Solicitud HTTP POST sin abrir realmente la página? – sicks

-2

La política del mismo origen de ajax es dejar de enviar su información a través de la red a su servidor personal, sin que usted sepa que está sucediendo. No se recomiendan publicaciones en la página a otros servidores, y pueden fallar.

¿Puedes resolverlo? Puede reemplazar el formulario enviado con jq para esperar a que se complete el estado de inicio de sesión y luego enviar el formulario; sin embargo, no estoy seguro de que sea una buena idea: un bucle de giro generalmente indica un error de diseño.

¿Cuánto control tiene el código? ¿Puede hacer que el envío haga un inicio de sesión, y al regresar envíe la búsqueda? ¿O hacer que la búsqueda no requiera el inicio de sesión?

+0

En este momento envía el inicio de sesión y luego la búsqueda, pero no hay forma de saber si la solicitud de inicio de sesión se ha completado antes de realizar la búsqueda. – sicks

+0

"No se recomiendan publicaciones en la página a otros servidores, y pueden fallar". metadaddy

15

Al realizar una solicitud POST a otro dominio, no podrá acceder a la respuesta con JavaScript (incluso si envía el formulario a un iframe).

Sin embargo, al usar XHR, tiene acceso completo a la respuesta, por lo que podría hacer muchas cosas malas, como p. Ej. accediendo a páginas donde el usuario está conectado, husmeando en su intranet corporativa, etc.

Por lo tanto, las restricciones del XHR no deben evitar el CSRF, pero para evitar la divulgación de información privilegiada.

+0

¿Puedes respaldar eso? Si envío una solicitud posterior en un cliente HTTP sin formato (como curl), tengo acceso a la respuesta y aún no he visto las oportunidades que describes. ¿Cómo podría el javascript tener una ventaja sobre una biblioteca http con acceso a más recursos? ¿Y qué pasa si simplemente utilicé un navegador que no aplicaba la misma política de origen, que se impone a nivel del cliente, no del servidor? – Anthony

+0

Al usar un cliente HTTP * usted * inicia la solicitud y controla qué datos (por ejemplo, cookies de inicio de sesión) envía. Pero generalmente no tiene control sobre el JavaScript que usa un sitio web. Por ejemplo, aquí en Stack Overflow una simple solicitud GET es suficiente para que yo vea información privilegiada solo disponible para los moderadores. Ahora, otro sitio web podría (si no se rechazó a través del encabezado x-frame-policy) usar un iframe que apunte a una URL que contenga dicha información, pero gracias a la misma política de origen no tiene forma de acceder a los datos en este página. – ThiefMaster

+0

Sí, pero es por eso que la misma política de origen es buena y vigente. Indicó que las publicaciones de formularios sobre ajax eran más vulnerables debido al acceso de js a la respuesta que pone al servidor en riesgo más que cualquier ataque xhr. Creo que lo que usted quiso decir fue que la misma política de origen (en general y no específica para la pregunta OP) protege tanto al servidor como al usuario. Un punto válido, pero su respuesta sugiere que es específico para formar publicaciones, lo que podría inducir a error a los lectores a pensar que existe algún otro mecanismo además de la misma política de origen. – Anthony

Cuestiones relacionadas