Cordova POST - Request Forbidden 403. Dispatcher-Servlet nicht erreicht

Ich entwickle eine Cordova-Anwendung.

Wenn ich eine $ .ajax-POST-Anforderung von der Cordova-App abschicke, die auf meinem physischen Gerät (nicht dem Emulator) ausgeführt wird, erhalte ich den Statuscode 403 Verboten.

Ich kann eine GET-Anfrage vom Gerät problemlos stellen. Ich kann mich auch über einen POST anmelden (Erhalt einer 302-Antwort).

Anfragen von Chrome werden perfekt bearbeitet.

Ich benutze Spring / Tomcat. Ich habe meinem tomcat web.xml CORS-Filter hinzugefügt und meiner config.xml in Cordova allow-origins * hinzugefügt.

Nachstehend sind die Protokollextrakte aufgeführt, die erstellt werden, wenn ich die POST-Anforderung erstens von Chrome und zweitens von meinem Gerät aus stelle.

Chrome-Anfrage:

org.springframework.security.web.FilterChainProxy: / submit-check an Position 1 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 2 von 11 in zusätzlicher Filterkette; Aktivierungsfilter: 'SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository: Derzeit ist keine HttpSession vorhanden org.springframework.security.web.context.HttpSessionSecurityContextRepository: In der HttpSession war kein Sicherheitskontext verfügbar. Ein neues wird erstellt. org.springframework.security.web.FilterChainProxy: / submit-check an Position 3 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter: HSTS-Header wird nicht injiziert, da er nicht mit dem requestMatcher-Header übereinstimmt org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequest springframework.security.web.FilterChainProxy: / submit-check auf Position 4 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Überprüfung der Übereinstimmung der Anforderung: '/ submit-check'; gegen '/ j_spring_security_logout' org.springframework.security.web.FilterChainProxy: / submit-check an Position 5 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Überprüfung der Übereinstimmung der Anforderung: '/ submit-check'; gegen '/ j_spring_security_check' org.springframework.security.web.FilterChainProxy: / submit-check an Position 6 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'RequestCacheAwareFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 7 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'SecurityContextHolderAwareRequestFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 8 von 11 in zusätzlicher Filterkette; Aktivierungsfilter: 'AnonymousAuthenticationFilter' org.springframework.security.web.authentication.AnonymousAuthenticationFilter: Bestückter SecurityContextHolder mit anonymem Token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2bc: Principal: anonymousUser; Berechtigungsnachweise: [GESCHÜTZT]; Authentifiziert: wahr; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0: 0: 0: 0: 0: 0: 0: 1; SessionId: null; Zugelassene Autoritäten: ROLE_ANONYMOUS 'org.springframework.security.web.FilterChainProxy: / submit-check an Position 9 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter: Angeforderte Sitzungs-ID 2BB345F22D731DB9A10B0BB65950502D ist ungültig. org.springframework.security.web.FilterChainProxy: / submit-check an Position 10 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 11 von 11 in zusätzlicher Filterkette; Filter auslösen: 'FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Übereinstimmung der Anforderung wird überprüft: '/ submit-check'; gegen '/**.html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor: Öffentliches Objekt - Authentifizierung nicht versucht org.springframework.security.web.FilterChainProxy: / submit-check hat das Ende der zusätzlichen Filterkette erreicht; Fahren Sie mit der ursprünglichen Kette fort. org.springframework.web.servlet.DispatcherServlet: DispatcherServlet mit dem Namen 'Dispatcher' verarbeitet POST-Anforderung für [/ ab / submit-check] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Nachschlagen Handlermethode für path / submit-check org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Handlermethode zurückgeben [public org.springframework.web.servlet.ModelAndView com.gm.ab.controller.MobileNavigation.save ( java.lang.String)] org.springframework.beans.factory.support.DefaultListableBeanFactory: Gibt die zwischengespeicherte Instanz der Singleton-Bean 'mobileNavigation' zurück. org.springframework.web.servlet.DispatcherServlet: Null ModelAndView wird an DispatcherServlet zurückgegeben und hat den Namen 'Dispatcher' angenommen HandlerAdapter hat die Anforderungsverarbeitung abgeschlossen org.springframework.web.servlet.DispatcherServlet: Anforderung org.springframework.security.web.access.ExceptionTranslationFilter: Kette verarbeitet normalerweise org.springframework.security.web.context.HttpSessionSecurityContextRepository: SecurityContext ist leer oder der Inhalt ist anonym - der Kontext wird nicht in HttpSession gespeichert. org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder wurde jetzt gelöscht, da die Anforderungsverarbeitung abgeschlossen ist

Cordova Anfrage

org.springframework.security.web.FilterChainProxy: / submit-check an Position 1 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 2 von 11 in zusätzlicher Filterkette; Aktivierungsfilter: 'SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository: Derzeit ist keine HttpSession vorhanden org.springframework.security.web.context.HttpSessionSecurityContextRepository: In der HttpSession war kein Sicherheitskontext verfügbar. Ein neues wird erstellt. org.springframework.security.web.FilterChainProxy: / submit-check an Position 3 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter: HSTS-Header wird nicht injiziert, da er nicht mit dem requestMatcher-Header übereinstimmt org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequest springframework.security.web.FilterChainProxy: / submit-check auf Position 4 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Überprüfung der Übereinstimmung der Anforderung: '/ submit-check'; gegen '/ j_spring_security_logout' org.springframework.security.web.FilterChainProxy: / submit-check an Position 5 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Überprüfung der Übereinstimmung der Anforderung: '/ submit-check'; gegen '/ j_spring_security_check' org.springframework.security.web.FilterChainProxy: / submit-check an Position 6 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'RequestCacheAwareFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 7 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'SecurityContextHolderAwareRequestFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 8 von 11 in zusätzlicher Filterkette; Aktivierungsfilter: 'AnonymousAuthenticationFilter' org.springframework.security.web.authentication.AnonymousAuthenticationFilter: Bestückter SecurityContextHolder mit anonymem Token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@90550640: Principal: anonymousUser; Berechtigungsnachweise: [GESCHÜTZT]; Authentifiziert: wahr; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@7798: RemoteIpAddress: 192.168.1.5; SessionId: null; Zugelassene Autoritäten: ROLE_ANONYMOUS 'org.springframework.security.web.FilterChainProxy: / submit-check an Position 9 von 11 in der zusätzlichen Filterkette; Auslösefilter: 'SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter: Angeforderte Sitzungs-ID F26DAEDA16CA5DAE443ABF8A4ADD836F ist ungültig. org.springframework.security.web.FilterChainProxy: / submit-check an Position 10 von 11 in der zusätzlichen Filterkette; Filter auslösen: 'ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy: / submit-check an Position 11 von 11 in zusätzlicher Filterkette; Filter auslösen: 'FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Übereinstimmung der Anforderung wird überprüft: '/ submit-check'; gegen '/**.html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor: Öffentliches Objekt - Authentifizierung nicht versucht org.springframework.security.web.FilterChainProxy: / submit-check hat das Ende der zusätzlichen Filterkette erreicht; mit der ursprünglichen Kette fortfahren org.springframework.security.web.access.ExceptionTranslationFilter: Kette normal verarbeitet org.springframework.security.web.context.HttpSessionSecurityContextRepository: SecurityContext ist leer oder der Inhalt ist anonym - der Kontext wird nicht in HttpSession gespeichert. org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder wurde jetzt gelöscht, da die Anforderungsverarbeitung abgeschlossen ist

Die Protokolle sind identisch, mit Ausnahme der folgenden Zeilen in der Anfrage, die von Chrome stammt:

org.springframework.web.servlet.DispatcherServlet: DispatcherServlet mit dem Namen 'dispatcher', das die POST-Anforderung für [/ ab / submit-check] verarbeitet org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Handler-Methode für Pfad suchen / submit-check org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Rückgabehandler-Methode [public org.springframework.web.servlet.ModelAndView com.gm.ab.controller.MobileNavigation.save (java.lang. String)] org.springframework.beans.factory.support.DefaultListableBeanFactory: Rückgabe der zwischengespeicherten Instanz der Singleton-Bean 'mobileNavigation' org.springframework.web.servlet.DispatcherServlet: Null ModelAndView an DispatcherServlet zurückgegeben, Name 'Dispatcher': HandlerAdapter abgeschlossen org.springframework.web.servlet.DispatcherServlet: Anfrage erfolgreich abgeschlossen

Aus irgendeinem Grund wird die Anfrage von Cordova nicht an Spring's DispatcherServlet gesendet, und ich weiß nicht, warum.

Ich habe Weinre für das Remote-Debuggen installiert und die von Chrome und Cordova gesendeten Anforderungsdaten scheinen identisch zu sein (obwohl Weinre die meisten Header-Informationen übersieht).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage