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).
Merci beaucoup. C'est une bonne réponse .. – Keerthivasan
Salut, j'ai des problèmes similaires. Comment avez-vous configuré web.xml pour autoriser "file: //"? –
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? –