2014-07-26 2 views
3

Je développe une application Cordova.Cordova POST - Demande Interdit 403. N'atteint pas le servlet Dispatcher

Lorsque je soumets une requête POST $ .ajax à partir de l'application Cordova exécutée sur mon périphérique physique (pas émulateur), je reçois un code d'état 403 interdit.

Je peux faire une requête GET à partir de l'appareil sans problème. Je peux également me connecter en utilisant un POST (recevoir une réponse 302 trouvée).

Les demandes de Chrome sont traitées parfaitement.

J'utilise Spring/Tomcat. J'ai ajouté le filtre CORS à mon fichier web tomcat.xml, et j'ai ajouté allow-origins * à mon fichier config.xml dans Cordova. Ci-dessous sont les extraits de journaux produits lorsque je fais la demande POST, d'abord à partir de Chrome, ensuite à partir de mon appareil.

Chrome Demande:

org.springframework.security.web.FilterChainProxy:/submit vérifier en position 1 sur 11 chaîne de filtres supplémentaires; filtrage: 'WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 2 sur 11 dans la chaîne de filtres supplémentaire; Filtre de tir: 'SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository: Non HttpSession existe actuellement org.springframework.security.web.context.HttpSessionSecurityContextRepository: Non SecurityContext était disponible à partir HttpSession: null. Un nouveau sera créé. org.springframework.security.web.FilterChainProxy:/submit-check en position 3 sur 11 dans une chaîne de filtres supplémentaire; Filtrer: 'HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter: N'injecte pas l'en-tête HSTS car il ne correspond pas à requestMatcher org.springframework.se[email protected]461e0eb8 org.springframework.security.web.FilterChainProxy:/submit-check à la position 4 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Vérification de la correspondance de la requête: '/ submit-check'; contre '/ j_spring_security_logout' org.springframework.security.web.FilterChainProxy:/submit-check en position 5 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Vérification de la correspondance de la requête: '/ submit-check'; contre '/ j_spring_security_check' org.springframework.security.web.FilterChainProxy:/submit-check en position 6 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'RequestCacheAwareFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 7 sur 11 dans la chaîne de filtres supplémentaire; Filtrer: 'SecurityContextHolderAwareRequestFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 8 sur 11 dans la chaîne de filtres supplémentaire; Filtrer: 'AnonymousAuthenticationFilter' org.springframework.security.web.authentication.AnonymousAuthenticationFilter: rempli SecurityContextHolder avec un jeton anonyme: 'org.sprin[email protected]9055c2bc: Principal: anonymousUser; Diplômes: [PROTÉGÉ]; Authentifié: vrai; Détails: org.sprin[email protected]b364: RemoteIpAddress: 0: 0: 0: 0: 0: 0: 1; SessionId: null; Autorisations accordées: ROLE_ANONYMOUS ' org.springframework.security.web.FilterChainProxy:/submit-check en position 9 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter: l'ID de session demandé 2BB345F22D731DB9A10B0BB65950502D n'est pas valide. org.springframework.security.web.FilterChainProxy:/submit-check en position 10 sur 11 dans la chaîne de filtres supplémentaire; Filtrer: 'ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 11 sur 11 dans la chaîne de filtres supplémentaire; filtre de filtrage: 'FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Vérification de la correspondance de la requête: '/ submit-check'; contre '/**.html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor: objet public - authentification non tentée org.springframework.security.web.FilterChainProxy:/submit-check atteint fin de la chaîne de filtres supplémentaire ; poursuivre avec la chaîne d'origine org.springframework.web.servlet.DispatcherServlet: DispatcherServlet avec le nom 'dispatcher' traitant la demande POST pour [/ ab/submit-check] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Recherche de la méthode du gestionnaire pour path/submit-check org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Méthode de retour du gestionnaire [public org.springframework.web.servlet.ModelAndView com.gm.ab.controller.MobileNavigation .save (java.lang.String)] org.springframework.beans.factory.support.DefaultListableBeanFactory: Renvoi de l'instance en cache du bean singleton 'mobileNavigation' org.springframework.web.servlet.DispatcherServlet: Null ModelAndView retourné à DispatcherServlet avec le nom 'dispatcher': en supposant que HandlerAdapter a terminé la gestion des requêtes org.springframework.web.servlet.DispatcherServlet: succès demande dûment remplie org.springframework.security.web.access.ExceptionTranslationFilter: chaîne traitée normalement org.springframework.security.web.context.HttpSessionSecurityContextRepository: SecurityContext est vide ou le contenu sont anonymes - Le contexte ne sera pas stocké dans HttpSession. org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder maintenant autorisé, en tant que traitement de la demande terminée

Cordova Demande

org.springframework.security.web.FilterChainProxy:/submit- vérifier en position 1 sur 11 dans la chaîne de filtre supplémentaire; filtrage: 'WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 2 sur 11 dans la chaîne de filtres supplémentaire; Filtre de tir: 'SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository: Non HttpSession existe actuellement org.springframework.security.web.context.HttpSessionSecurityContextRepository: Non SecurityContext était disponible à partir HttpSession: null. Un nouveau sera créé. org.springframework.security.web.FilterChainProxy:/submit-check en position 3 sur 11 dans une chaîne de filtres supplémentaire; Filtrer: 'HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter: N'injecte pas l'en-tête HSTS car il ne correspond pas à requestMatcher org.springframework.se[email protected]461e0eb8 org.springframework.security.web.FilterChainProxy:/submit-check à la position 4 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Vérification de la correspondance de la requête: '/ submit-check'; contre '/ j_spring_security_logout' org.springframework.security.web.FilterChainProxy:/submit-check en position 5 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Vérification de la correspondance de la requête: '/ submit-check'; contre '/ j_spring_security_check' org.springframework.security.web.FilterChainProxy:/submit-check à la position 6 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'RequestCacheAwareFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 7 sur 11 dans la chaîne de filtres supplémentaire; Filtrer: 'SecurityContextHolderAwareRequestFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 8 sur 11 dans la chaîne de filtres supplémentaire; filtrage: 'AnonymousAuthenticationFilter' org.springframework.security.web.authentication.AnonymousAuthenticationFilter: rempli SecurityContextHolder avec un jeton anonyme: 'org.sprin[email protected]90550640: principal: anonymousUser; Diplômes: [PROTÉGÉ]; Authentifié: vrai; Détails: org.sprin[email protected]7798: RemoteIpAddress: 192.168.1.5; SessionId: null; Autorisations accordées: ROLE_ANONYMOUS ' org.springframework.security.web.FilterChainProxy:/submit-check en position 9 sur 11 dans la chaîne de filtres supplémentaire; Filtrage: 'SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter: L'ID de session demandé F26DAEDA16CA5DAE443ABF8A4ADD836F n'est pas valide. org.springframework.security.web.FilterChainProxy:/submit-check en position 10 sur 11 dans la chaîne de filtres supplémentaire; Filtrer: 'ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy:/submit-check en position 11 sur 11 dans la chaîne de filtres supplémentaire; filtre de filtrage: 'FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher: Vérification de la correspondance de la requête: '/ submit-check'; contre '/**.html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor: objet public - authentification non tentée org.springframework.security.web.FilterChainProxy:/submit-check atteint fin de la chaîne de filtres supplémentaire ; poursuivre avec la chaîne d'origine org.springframework.security.web.access.ExceptionTranslationFilter: Chaîne traitée normalement org.springframework.security.web.context.HttpSessionSecurityContextRepository: SecurityContext est vide ou le contenu est anonyme - le contexte ne sera pas stocké dans HttpSession. org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder maintenant autorisé, en tant que traitement de la demande terminée

Les journaux sont identiques, à l'exception de ces lignes qui sont dans la demande en provenance de Chrome:

org.springframework.web.servlet.DispatcherServlet: DispatcherServlet avec le nom 'dispatcher' traitant la requête POST pour [/ ab/submit-check] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: recherche de la méthode du gestionnaire pour path/submit-check org.springframework.web.servlet. mvc.method.annotation.RequestMappingHandlerMapping: méthode de gestionnaire de retour [public org.springframework.web.servlet.ModelAndView com.gm.ab.controller.MobileNavigation.save (java.lang.String)] org.springframework.beans.factory. support.DefaultListableBeanFactory: Renvoi de l'instance en cache du bean singleton 'mobileNavigation' org.springframework.web.servlet.DispatcherServlet: Null ModelAndView retourné à DispatcherServlet avec le nom 'dispatcher': en supposant que HandlerAdapter a terminé la gestion des requêtes org.springframework.web.servlet.DispatcherServlet : La requête a abouti avec succès

Pour une raison quelconque, la requête provenant de Cordova n'est pas envoyée à DispatcherServlet de Spring et je ne sais pas pourquoi. J'ai installé Weinre au débogage à distance et les données de demande envoyées par Chrome et Cordova semblent être identiques (bien que Weinre manque la plupart des informations d'en-tête).

Répondre

1

Géré pour résoudre ce problème.

Le problème était d'avoir un filtre CORS dans mon site Web tomcat.xml (le tomcat global web.xml dans conf). Pour une application Cordova qui n'a pas besoin d'être là.

Cordova envoie une requête en ayant l'en-tête "Origine: fichier: //". Si le filtre CORS est défini dans Tomcat, la demande échouera.

La suppression du filtre CORS du fichier web.xml fonctionne et je peux maintenant envoyer des données.

+0

Merci beaucoup. C'est une bonne réponse .. – Keerthivasan

+0

Salut, j'ai des problèmes similaires. Comment avez-vous configuré web.xml pour autoriser "file: //"? –

+0

Salut, je sais que ça fait longtemps. Vous avez dit dans votre réponse d'enlever le filtre cors. Dans ce cas, comment s'assurer que tomcat accepte les demandes d'origine croisée? –