Presentery versus preflight requests (BC break)
- David Grudl
- Nette Core | 8215
Pokud provádíte AJAXové požadavky na jinou (sub)doménu, můžete si všimnout, že prohlížeč vytvoří dva požadavky s identickou URL. První z těchto požadavků používá metodu OPTIONS a je známý jako „preflight request“. Jeho účelem je ověřit, zda je cílový server nastaven tak, aby povolil AJAXový požadavek z původní domény. Více informací o tomto mechanismu naleznete na MDN web docs.
Tento preflight request může však způsobit různé nechtěné situace, především pokud presenter vůbec nepočítá s metodou OPTIONS a vykoná tak běžnou akci, ke které by ale neměl mít volající oprávnění. Proto od verze nette/application v3.1.13 je zavedeno omezení, kdy presentery kontrolují, že HTTP metoda je jednou z následujících: GET, POST, HEAD, PUT, DELETE (bude doplněno ještě PATCH).
Pokud váš presenter očekává a zpracovává metodu OPTIONS, je důležité ji přidat mezi povolené metody:
class MyPresenter extends Nette\Application\UI\Presenter
{
protected function checkHttpMethod(): void
{
$this->allowedMethods[] = 'OPTIONS';
parent::checkHttpMethod();
}
}