Internet Explorer (con le impostazioni predefinite, che presumo in genere saranno effettive sui desktop di Great Unwashed) sembra non gradire l'idea di accettare il contenuto degli allegati in una risposta HTTP se la richiesta corrispondente non è stata effettuata direttamente da un utente azione (come un gestore di "clic" o un modulo nativo invia). Probabilmente ci sono più dettagli e sfumature, ma questo è il comportamento di base che mi sta frustrando.Quali sono le tecniche per aggirare le regole di sicurezza del download del file IE?
Mi sembra che questa situazione sia comune: l'interfaccia utente di fronte a qualche contenuto scaricabile — dice, un report PDF preparato — consente di utilizzare alcune opzioni e input per la creazione del contenuto. Ora, come con tutti i moduli che consentono all'utente di stabilire come un'applicazione fa qualcosa, è possibile che l'input sia errato. Non sempre, ma a volte.
Quindi c'è un dilemma. Se il client cerca di fare qualcosa di stravagante, come eseguire una transazione AJAX per consentire al server di controllare i contenuti del modulo, e quindi inviare nuovamente per ottenere il download, a IE non piacerà. Non piacerà perché la transazione HTTP effettiva che riporta l'allegato non avverrà nel gestore di eventi azione dell'utente originale, ma nel callback del completamento AJAX. Peggio ancora, dal momento che la barra di sicurezza di IE sembra pensare che la soluzione a tutti i problemi è semplicemente ricaricare la pagina esterna dal suo URL originale, il suo invito all'utente a procedere e scaricare i contenuti sospetti non funzionerà nemmeno.
L'altra opzione è quella di far sparire il modulo. Il server controlla i parametri e, se c'è qualcosa di sbagliato, risponde con la pagina del contenitore di moduli, in modo appropriato con i messaggi di errore. Se il contenuto del modulo è OK, genera il contenuto e lo invia nuovamente nella risposta HTTP come file allegato. In questo caso (penso), IE è felice perché il contenuto è stato apparentemente richiesto direttamente dall'utente (che è, tra l'altro, un modo ridicolmente fragile per raccontare buoni contenuti da contenuti non validi). Questo è grandioso, ma il problema ora è che l'ambiente client (cioè il codice sulla mia pagina) non può dire che il download ha funzionato, quindi il modulo è ancora solo seduto lì. Se il mio modulo è in una sorta di finestra di dialogo, allora ho davvero bisogno di chiuderlo quando l'operazione è completa — in realtà, questa è una delle motivazioni per farlo in modo AJAX.
Mi sembra che l'unica cosa da fare sia dotare le finestre di dialogo del modulo con messaggi che dicono qualcosa come "Chiudi quando il download inizia." Questo mi sembra davvero schifo perché è un esempio di un'interfaccia "per favore premi questo pulsante per me": idealmente, il mio codice dovrebbe essere in grado di spingere il buutton quando è appropriato. Una cosa fondamentale che non conosco è se esiste un modo in cui il codice client può rilevare che l'invio del modulo ha comportato il download di un allegato. Non ho mai sentito di un modo per rilevarlo, ma ciò mi spezzerebbe l'impasse.
No, quando si invia un modulo e la risposta è un allegato (ovvero un file da scaricare) il browser non ridisegna la pagina. – Pointy
Quest'ultima sembra davvero una buona idea! Mi chiedo se il cookie verrà impostato correttamente se il download non riesce. Idea brillante se funziona o no! – Graza
@Pointy: Ah, ok, sembrava un po 'strano. Penso che queste idee di base possano essere adattate a quello che stai facendo, ma senza essere nel profondo di esso ... @Graza: È gentile. Non penso che lo definirei "brillante" se non funziona, ma grazie. :-) –