Chciałbym przechwycić żądanie OPTIONS z moim kontrolerem przy użyciu Spring MVC, ale jest ono przechwytywane przez DispatcherServlet. Jak mogę to zarządzać?Jak obsługiwać OPCJE HTTP za pomocą Spring MVC?
Odpowiedz
@RequestMapping(value="/youroptions", method=RequestMethod.OPTIONS)
public View getOptions() {
}
należy skonfigurować dispatcherServlet poprzez ustawienie jej dispatchOptionsRequest
do true
w rzeczywistości to nie zadziała, ponieważ DispatcherServlet przechwyci żądanie i poradzi sobie z nim. Zamiast tego należy skonfigurować DispatcherServlet. Miałem dużo bólu z tym problemem, a obecnie częściowo rozwiązałem problem. Chciałem opublikować moje rozwiązanie dla społeczności, ale ... ponieważ mam mniej niż 100 punktów reputacji, stackoverflow zmuszają mnie do czekania 8 godzin przed udzieleniem mi odpowiedzi na własne pytania. – MaVVamaldo
Dodałem aktualizację – Bozho
tak, to jest rozwiązanie. Powinienem cię wcześniej poznać, dobry Boże! XD Jednak jest to rozwiązanie "częściowe", ponieważ DispatcherServlet wykona "trochę pracy" przed delegowaniem kontrolera. Rzeczywiście, nawet jeśli nie dotkniesz nagłówka "Zezwalaj", zostanie wypełniona lista "dozwolonej metody". W moim przypadku nie stanowiłoby to problemu, ale przypuszczam, że jest to dla kogoś innego. – MaVVamaldo
dodałam trochę więcej szczegółów do odpowiedzi Bozho dla początkujących. Czasami warto pozwolić kontrolerowi sprężynowemu zarządzać żądaniem OPTIONS (na przykład, aby ustawić poprawny nagłówek "Access-Control-Allow- *" do obsługi wywołania AJAX). Jeśli jednak spróbować powszechną praktyką
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.OPTIONS, value="/**")
public void manageOptions(HttpServletResponse response)
{
//do things
}
}
To nie będzie działać, ponieważ DispatcherServlet przechwyci żądanie OPTIONS klienta.
Rozwiązaniem jest bardzo prosta:
... Musisz skonfigurować DispatcherServlet z pliku web.xml następująco:
...
<servlet>
<servlet-name>yourServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>dispatchOptionsRequest</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
Dodanie parametru „dispatchOptionsRequest” i ustawienie go na true .
Teraz DispatcherServlet deleguje obsługę OPTIONS do kontrolera i zostanie uruchomiona metoda manageOption().
Mam nadzieję, że to pomoże.
PS. Szczerze mówiąc, widzę, że DispatcherServlet dołącza listę dozwolonej metody do odpowiedzi. W moim przypadku nie było to ważne i zostawiłem to. Może potrzebne są dalsze badania.
ale to nie działa, jeśli na przykład procedura handlowa jest zarejestrowana w punkcie końcowym "/ x/y". Teraz opcja-żądanie do/x działa, ale nie do/x/y czy jest jakaś opcja rozwiązania tego problemu? co oznacza dodanie tej obsługi OPCJI do wszystkich zarejestrowanych punktów końcowych? Myślę o przechwytywaczach, ale czy istnieje jakiś inny sposób? – wrm
Jako szybkie uzupełnienie powyższych 2 odpowiedzi, oto jak włączyć dispatchOptionsRequest w środowisku serwletu 3 (bez web.xml), ponieważ zajęło mi trochę czasu, aby dowiedzieć się, jak zastosować powyższe odpowiedzi w języku innym niż xml Ustawiać.
W środowisku źródłowym 3.2/servlet 3, będziesz mieć pewną odmianę klasy inicjatora DispatcherServlet
, która jest odpowiednikiem java web.xml; w moim przypadku jest to AbstractAnnotationConfigDispatcherServletInitializer
. Dodanie następującego kodu pozwoli dispatchOptionsRequest:
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setInitParameter("dispatchOptionsRequest", "true");
}
wziąłem następujące podejście:
Korzystanie Maven (or manually) pociągnąć w tym dependancy:
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>1.3.2</version>
</dependency>
Ma to wdrożenie do przechwytywania wszystkich przychodzące żądania OPTIONS. W pliku web.xml dodać następujące config:
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Content-Type,Accept,Origin</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Problem widziałem z podejściem/** to bardziej konkretne wdrożenie Kontroler będzie to zmienić.
na wiosnę bez pliku web.xml, oraz w oparciu o Paul Adamson odpowiedzi, po prostu ustawić parametr dispatchOptionsRequest
do true
do dyspozytora, aby przetwarzać Options
wywołań metod.
ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(applicationContext));
dispatcher.setInitParameter("dispatchOptionsRequest", "true");
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
- 1. Spring-MVC 3.1: Jak zmapować adresy URL za pomocą ukośnika?
- 2. Jak skonfigurować Spring Social za pomocą XML
- 3. Jak obsługiwać wiele subdomen oddzielnie w aplikacji Spring MVC?
- 4. Jak mogę obsługiwać HTTP powoli?
- 5. Sterownik Spring MVC Parametry zapytania HTTP GET
- 6. Jak zaimplementować pasek postępu za pomocą Spring 3 MVC?
- 7. Jak zaimplementować statystykę za pomocą danych dropwizard i spring-mvc
- 8. Jak napisać prawidłową globalną procedurę obsługi błędów za pomocą Spring MVC/Spring Boot
- 9. Jak obsługiwać żądania HTTP przez meteor?
- 10. Dynamiczne ustawianie niestandardowego nagłówka HTTP za pomocą klienta Spring-WS
- 11. Jak przekazywać opcje SSH za pomocą Fabric?
- 12. Jak obsługiwać pojedyncze zasoby za pomocą RESTAdapter
- 13. Jak obsługiwać sesję NHibernate za pomocą usług?
- 14. Jak obsługiwać formularze wieloczęściowe w ASP.NET MVC?
- 15. Spring MVC - Wyjątek uruchamiania RestTemplate, gdy wystąpi http 404
- 16. AngularJS ze Spring-mvc
- 17. Jak filtrować opcje listy rozwijanej za pomocą innej rozwijanej listy
- 18. Jak obsługiwać ochronę CSRF za pomocą usług sieci Web Spring RESTful?
- 19. Jak obsługiwać przesyłanie plików systemu Windows za pomocą Selenium WebDriver?
- 20. Spring MVC controller versioning
- 21. Jak działa parametr metody kontrolera Spring MVC?
- 22. Jak obsługiwać GIT przez HTTP przez NGINX za pomocą użytkownika/hasła?
- 23. Spring MVC zwraca HTTP 406 na adres URL z kropką
- 24. Jak obsługiwać aplikację jonową za pomocą protokołu HTTPS?
- 25. Czy nagłówek HTTP Allow powinien zawierać "OPCJE"?
- 26. Problem konfiguracji: Spring NamespaceHandler dla [http://www.springframework.org/schema/mvc]
- 27. Nie znaleziono mapowania dla żądania HTTP (Spring MVC)
- 28. Jak wysłać xml za pośrednictwem żądania HTTP i odebrać go za pomocą ASP.NET MVC?
- 29. Jak złożyć formularz http za pomocą C#
- 30. Jak wysłać żądanie HTTP za pomocą Telnet
Dla tych na wiosennym Boot to kontynuacja pytanie może być przydatna: http://stackoverflow.com/questions/33331042/how-to-handle-http-options-requests-in-spring-boot – Jonik