Signál bez hlavičky ‚X-Requested-With‘: ‚XMLHttpRequest‘ vrací HTML celého dokumentu místo snippetu

crassus
Backer | 78
+
0
-

Zdravím,

rád bych bych překreslil snippet přes CORS request bez preflight requestu.

V komponentě mám handleRedraw:

    /**
     * @crossOrigin
     */
    public function handleRedraw(): void
    {
        $this->redrawControl();
    }

V presenteru přidávám CORS hlavičky:

$this->getHttpResponse()->setHeader('Access-Control-Allow-Origin', '*');
$this->getHttpResponse()->setHeader('Access-Control-Allow-Headers', '*');

Pokud z clienta pošlu request, který má v sobě hlavičku: ‚X-Requested-With‘: ‚XMLHttpRequest‘, tak mi sice Nette vrátí překreslený snippet, ale až na druhý request, protože se kvůli zmíněné hlavičce posílá preflight request.

Pokud z clienta pošlu request bez přidané hlavičky, tak se pošle pouze 1 request, ale Nette mi bohužel vrátí HTML celého dokumentu místo konkrétního snippetu.

Kvůli chybějící hlavičky vrací metoda isAjax() hodnotu FALSE. Tím se pravděpodobně ignoruje GET „?do“ / POST „_do“ a tak nedojde k překreslení snippetu.

Na 1 CORS request umím zatím překreslit pouze celou komponentu tímhle způsobem:

    public function render(?bool $toString = FALSE): ?string
    {
        $template = $this->getTemplate();
        $template->setFile(__DIR__ . '/AfbymaqyirControl.latte');

        return $toString ? $template->renderToString() : $template->render();
    }

    /**
     * @crossOrigin
     */
    public function handleRedraw(): void
    {
        $this->presenter->sendJson($this->render(TRUE));
    }

Ale tím bohužel nepřekreslím vnitřní snippety komponenty :(

Marek Bartoš
Nette Blogger | 1297
+
0
-

X-Requested-With: XMLHttpRequest se používá pro detekování ajaxové requestu všude a Nette by se toho mělo držet.

V kombinaci cross-origin a ajaxu je preflight request součástí bezpečnostního mechanizmu, bylo by tak rozumnější se s requestem navíc smířit namísto workaroundů. https://markitzeroday.com/…equests.html

David Grudl
Nette Core | 8254
+
0
-

Spíš si tam nastav cachování pro preflight a jeden požadavek navíc nehraje roli.

crassus
Backer | 78
+
0
-

David Grudl napsal(a):

Spíš si tam nastav cachování pro preflight a jeden požadavek navíc nehraje roli.

Super děkuji moc :)