Cordova POST - 请求禁止403.未到达Dispatcher Servlet

时间:2014-07-26 16:48:28

标签: spring tomcat cordova cors servlet-3.0

我正在开发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错过了大部分标题信息)。

1 个答案:

答案 0 :(得分:1)

管理来解决这个问题。

问题是我的tomcat web.xml中有一个CORS过滤器(conf中的tomcat全局web.xml)。对于不需要在那里的Cordova应用程序。

Cordova通过标题“Origin:file://”发送请求。如果在Tomcat中设置了CORS过滤器,则请求将失败。

从web.xml中删除CORS过滤器,我现在可以POST数据了。