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

crassus
Backer | 71
+
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 :(

Mabar
Člen | 377
+
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 | 7445
+
0
-

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

crassus
Backer | 71
+
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 :)