Signál bez hlavičky ‚X-Requested-With‘: ‚XMLHttpRequest‘ vrací HTML celého dokumentu místo snippetu
- crassus
- Backer | 73
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 | 970
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 | 7945
Spíš si tam nastav cachování pro preflight a jeden požadavek navíc nehraje roli.
- crassus
- Backer | 73
David Grudl napsal(a):
Spíš si tam nastav cachování pro preflight a jeden požadavek navíc nehraje roli.
Super děkuji moc :)