Cordova POST - Запрос запрещен 403. Не доходит до сервлет-диспетчера

Я разрабатываю приложение Cordova.

Когда я отправляю запрос POST $ .ajax из приложения Cordova, работающего на моем физическом устройстве (не эмуляторе), я получаю код состояния 403, запрещенный.

Я могу сделать запрос GET с устройства без проблем. Я также могу войти, используя POST (получая 302 найденных ответа).

Запросы от Chrome обрабатываются отлично.

Я использую Spring / Tomcat. Я добавил CORS-фильтр в свой tomcat web.xml и добавил allow-originins * в мой config.xml в Cordova.

Ниже приведены выдержки из журнала, полученные при выполнении запроса POST, сначала из Chrome, затем из моего устройства.

Запрос Chrome:

org.springframework.security.web.FilterChainProxy: / submit-check в позиции 1 из 11 в цепочке дополнительных фильтров; фильтр активации: 'WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 2 из 11 в цепочке дополнительных фильтров; фильтр активации: 'SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository: в настоящее время HttpSession не существует org.springframework.security.web.context.HttpSessionSecurityContextRepository: не было. Новый будет создан. org.springframework.security.web.FilterChainProxy: / submit-check в позиции 3 из 11 в цепочке дополнительных фильтров; фильтр активации: 'HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter: не внедряет заголовок HSTS, так как он не совпадает с запросом springframework.security.web.FilterChainProxy: / отправить проверку в позиции 4 из 11 в цепочке дополнительных фильтров; фильтр срабатывания: 'LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: проверка соответствия запроса: '/ submit-check'; против '/ j_spring_security_logout' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 5 из 11 в цепочке дополнительных фильтров; фильтр активации: 'UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: проверка соответствия запроса: '/ submit-check'; против '/ j_spring_security_check' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 6 из 11 в цепочке дополнительных фильтров; фильтр активации: 'RequestCacheAwareFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 7 из 11 в цепочке дополнительных фильтров; фильтр активации: 'SecurityContextHolderAwareRequestFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 8 из 11 в цепочке дополнительных фильтров; фильтр активации: 'AnonymousAuthenticationFilter' org.springframework.security.web.authentication.AnonymousAuthenticationFilter: заполненный SecurityContextHolder анонимным токеном: 'org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2b: Полномочия: [ЗАЩИЩЕНО]; Аутентифицировано: правда; Подробности: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0: 0: 0: 0: 0: 0: 0: 1; SessionId: null; Предоставленные полномочия: ROLE_ANONYMOUS 'org.springframework.security.web.FilterChainProxy: / submit-check в позиции 9 из 11 в цепочке дополнительных фильтров; фильтр активации: 'SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter: запрашиваемый идентификатор сеанса 2BB345F22D731DB9A10B0BB65950502D недействителен. org.springframework.security.web.FilterChainProxy: / submit-check в позиции 10 из 11 в цепочке дополнительных фильтров; фильтр срабатывания: 'ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 11 из 11 в цепочке дополнительных фильтров; стрельба Filter: 'FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher: проверка соответствия запроса: '/ submit-check'; против '/**.html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor: открытый объект - попытка аутентификации не предпринималась org.springframework.security.web.FilterChainProxy: / submit-check достигнут конец дополнительной цепочки фильтров; продолжаем работу с оригинальной цепочкой org.springframework.web.servlet.DispatcherServlet: DispatcherServlet с именем 'dispatcher', обрабатывающим POST-запрос для [/ ab / submit-check] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: Поиск метод-обработчик для path / submit-check org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: возвращающий метод-обработчик [public org.springframework.web.servlet.ModelAndView com.gm.ab.controller.MobileNavigation.save ( java.lang.String)] org.springframework.beans.factory.support.DefaultListableBeanFactory: возвращение кэшированного экземпляра одноэлементного компонента 'mobileNavigation' org.springframework.web.servlet.DispatcherServlet: нулевой ModelAndView возвращается диспетчеру диспетчера для доставки диспетчеру запросов HandlerAdapter завершил обработку запроса org.springframework.web.servlet.DispatcherServlet: успешно завершенный запрос org.springframework.security.web.access.ExceptionTranslationFilter: цепь обработана обычно org.springframework.security.web.context.HttpSessionSecurityContextRepository: SecurityContext пуст или содержимое анонимно - контекст не будет сохранен в HttpSession. org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder теперь очищен после завершения обработки запроса

Кордова Запрос

org.springframework.security.web.FilterChainProxy: / submit-check в позиции 1 из 11 в цепочке дополнительных фильтров; фильтр активации: 'WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 2 из 11 в цепочке дополнительных фильтров; фильтр активации: 'SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository: в настоящее время HttpSession не существует org.springframework.security.web.context.HttpSessionSecurityContextRepository: не было. Новый будет создан. org.springframework.security.web.FilterChainProxy: / submit-check в позиции 3 из 11 в цепочке дополнительных фильтров; фильтр активации: 'HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter: не внедряет заголовок HSTS, так как он не совпадает с запросом springframework.security.web.FilterChainProxy: / отправить проверку в позиции 4 из 11 в цепочке дополнительных фильтров; фильтр срабатывания: 'LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: проверка соответствия запроса: '/ submit-check'; против '/ j_spring_security_logout' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 5 из 11 в цепочке дополнительных фильтров; фильтр активации: 'UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher: проверка соответствия запроса: '/ submit-check'; против '/ j_spring_security_check' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 6 из 11 в цепочке дополнительных фильтров; фильтр активации: 'RequestCacheAwareFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 7 из 11 в цепочке дополнительных фильтров; фильтр активации: 'SecurityContextHolderAwareRequestFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 8 из 11 в цепочке дополнительных фильтров; фильтр активации: 'AnonymousAuthenticationFilter' org.springframework.security.web.authentication.AnonymousAuthenticationFilter: заполненный SecurityContextHolder анонимным токеном: 'org.springframework.security.authentication.AnonymousAuthenticationToken@90550640: субъект: Полномочия: [ЗАЩИЩЕНО]; Аутентифицировано: правда; Подробности: org.springframework.security.web.authentication.WebAuthenticationDetails@7798: RemoteIpAddress: 192.168.1.5; SessionId: null; Предоставленные полномочия: ROLE_ANONYMOUS 'org.springframework.security.web.FilterChainProxy: / submit-check в позиции 9 из 11 в цепочке дополнительных фильтров; фильтр активации: 'SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter: запрошенный идентификатор сеанса F26DAEDA16CA5DAE443ABF8A4ADD836F недопустим. org.springframework.security.web.FilterChainProxy: / submit-check в позиции 10 из 11 в цепочке дополнительных фильтров; фильтр срабатывания: 'ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy: / submit-check в позиции 11 из 11 в цепочке дополнительных фильтров; стрельба Filter: 'FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher: проверка соответствия запроса: '/ submit-check'; против '/**.html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor: открытый объект - попытка аутентификации не предпринималась org.springframework.security.web.FilterChainProxy: / submit-check достигнут конец дополнительной цепочки фильтров; Исходя из исходной цепочки org.springframework.security.web.access.ExceptionTranslationFilter: Цепочка обрабатывается нормально org.springframework.security.web.context.HttpSessionSecurityContextRepository: SecurityContext пусто или содержимое не является анонимным - контекст не будет сохранен в HttpSession. org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder теперь очищен после завершения обработки запроса

Журналы идентичны, за исключением этих строк, которые находятся в запросе, исходящем из Chrome:

org.springframework.web.servlet.DispatcherServlet: DispatcherServlet с именем 'dispatcher', обрабатывающим POST-запрос для [/ ab / submit-check] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: поиск метода обработчика для / submit-check org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: метод возвращаемого обработчика [public org.springframework.web.servlet.ModelAndView com.gm.ab.controller.MobileNavigation.save (java.lang. String)] org.springframework.beans.factory.support.DefaultListableBeanFactory: возвращение кэшированного экземпляра одиночного bean-компонента 'mobileNavigation' org.springframework.web.servlet.DispatcherServlet: Null ModelAndView возвращено диспетчеру обработчика запросов с обработчиком запросов: обработчик запросов: обработчик запросов с обработчиком имен org.springframework.web.servlet.DispatcherServlet: успешно выполненный запрос

По какой-то причине запрос, исходящий от Cordova, не отправляется в Spring DispatcherServlet, и я не могу понять, почему нет.

Я установил Weinre для удаленной отладки, и данные запроса, отправленные Chrome и Cordova, кажутся идентичными (хотя Weinre пропускает большую часть информации заголовка).

Ответы на вопрос(1)

Ваш ответ на вопрос