我正在开发Cordova应用程序。
当我从物理设备(非模拟器)上运行的Cordova应用程序提交$ .ajax POST请求时,我收到状态码403禁止。
我可以从设备发出GET请求没问题。我也可以使用POST登录(收到302 Found Response)。
来自Chrome的请求得到了完美处理。
我正在使用Spring / Tomcat。我在我的tomcat web.xml中添加了CORS过滤器,并在Cordova中的config.xml中添加了allow-origins *。
以下是我发出POST请求时产生的日志摘录,首先来自Chrome,其次来自我的设备。
Chrome请求
org.springframework.security.web.FilterChainProxy:/在另一个过滤器链中的11位置提交检查;触发过滤器:' WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy:/提交检查在第2位的11位额外的过滤链中;触发过滤器:' SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository:当前没有HttpSession存在 org.springframework.security.web.context.HttpSessionSecurityContextRepository:HttpSession中没有可用的SecurityContext:null。将创建一个新的。 org.springframework.security.web.FilterChainProxy:/提交检查在第3位的11位额外的过滤器链;触发过滤器:' HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter:没有注入HSTS头,因为它与requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter $ SecureRequestMatcher@461e0eb8不匹配 org.springframework.security.web.FilterChainProxy:/ submit-check在第4位的11位于另外的过滤链中;触发过滤器:' LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher:检查请求的匹配:' / submit-check&#39 ;;反对' / j_spring_security_logout' org.springframework.security.web.FilterChainProxy:/ submit-check在第5位的11位于另外的过滤链中;触发过滤器:' UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher:检查请求的匹配:' / submit-check&#39 ;;反对' / 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@9055c2bc:Principal:anonymousUser;证书:[保护];认证:真实;详细信息: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:/提交检查在第9位的11位额外的过滤链中;触发过滤器:' SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter:请求的会话ID 2BB345F22D731DB9A10B0BB65950502D无效。 org.springframework.security.web.FilterChainProxy:/ submit-check在第10位的11位附加过滤链中;触发过滤器:' ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy:/ submit-check在11位11的另一个过滤链中;触发过滤器:' FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher:检查请求的匹配:' / submit-check&#39 ;;反对' / **。html' org.springframework.security.web.access.intercept.FilterSecurityInterceptor:公共对象 - 未尝试身份验证 org.springframework.security.web.FilterChainProxy:/ submit-check已达到额外过滤器链的末尾;继续与原始链 org.springframework.web.servlet.DispatcherServlet:DispatcherServlet,名称为' dispatcher'处理[/ ab / submit-check]的POST请求 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping:查找路径/提交检查的处理程序方法 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返回DispatcherServlet,名称为' dispatcher&#39 ;:假设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现已清除,请求处理完成
Cordova请求
org.springframework.security.web.FilterChainProxy:/在另一个过滤器链中的11位置提交检查;触发过滤器:' WebAsyncManagerIntegrationFilter' org.springframework.security.web.FilterChainProxy:/提交检查在第2位的11位额外的过滤链中;触发过滤器:' SecurityContextPersistenceFilter' org.springframework.security.web.context.HttpSessionSecurityContextRepository:当前没有HttpSession存在 org.springframework.security.web.context.HttpSessionSecurityContextRepository:HttpSession中没有可用的SecurityContext:null。将创建一个新的。 org.springframework.security.web.FilterChainProxy:/提交检查在第3位的11位额外的过滤器链;触发过滤器:' HeaderWriterFilter' org.springframework.security.web.header.writers.HstsHeaderWriter:没有注入HSTS头,因为它与requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter $ SecureRequestMatcher@461e0eb8不匹配 org.springframework.security.web.FilterChainProxy:/ submit-check在第4位的11位于另外的过滤链中;触发过滤器:' LogoutFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher:检查请求的匹配:' / submit-check&#39 ;;反对' / j_spring_security_logout' org.springframework.security.web.FilterChainProxy:/ submit-check在第5位的11位于另外的过滤链中;触发过滤器:' UsernamePasswordAuthenticationFilter' org.springframework.security.web.util.matcher.AntPathRequestMatcher:检查请求的匹配:' / submit-check&#39 ;;反对' / 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:Principal:anonymousUser;证书:[保护];认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@7798:RemoteIpAddress:192.168.1.5; SessionId:null;授权机构:ROLE_ANONYMOUS' org.springframework.security.web.FilterChainProxy:/提交检查在第9位的11位额外的过滤链中;触发过滤器:' SessionManagementFilter' org.springframework.security.web.session.SessionManagementFilter:请求的会话ID F26DAEDA16CA5DAE443ABF8A4ADD836F无效。 org.springframework.security.web.FilterChainProxy:/ submit-check在第10位的11位附加过滤链中;触发过滤器:' ExceptionTranslationFilter' org.springframework.security.web.FilterChainProxy:/ submit-check在11位11的另一个过滤链中;触发过滤器:' FilterSecurityInterceptor' org.springframework.security.web.util.matcher.AntPathRequestMatcher:检查请求的匹配:' / submit-check&#39 ;;反对' / **。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'处理[/ ab / submit-check]的POST请求 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping:查找路径/提交检查的处理程序方法 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返回DispatcherServlet,名称为' dispatcher&#39 ;:假设HandlerAdapter已完成请求处理 org.springframework.web.servlet.DispatcherServlet:已成功完成请求
由于某种原因,来自Cordova的请求没有被发送到Spring的DispatcherServlet,我不知道为什么不这样做。
我已将Weinre安装到远程调试中,Chrome和Cordova发送的请求数据似乎相同(尽管Weinre错过了大部分标题信息)。
答案 0 :(得分:1)
管理来解决这个问题。
问题是我的tomcat web.xml中有一个CORS过滤器(conf中的tomcat全局web.xml)。对于不需要在那里的Cordova应用程序。
Cordova通过标题“Origin:file://”发送请求。如果在Tomcat中设置了CORS过滤器,则请求将失败。
从web.xml中删除CORS过滤器,我现在可以POST数据了。