热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:使用axios后台无法接收到数据的解决方案

篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用axios后台无法接收到数据的解决方案相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了使用 axios 后台无法接收到数据的解决方案相关的知识,希望对你有一定的参考价值。



使用 axios 后台无法接收到数据的解决方案

如果想看排错思路的,可以看完踩坑经历,想直接要结果的,可以直接看解决方案


踩坑经历

最近我在使用 SSM + Vue 做自己的小项目。Dao层 和 Service层 之类的代码已经写好了,就差 Controller层 和 Vue 的视图层还没有完成。今天在使用 axios 请求Controller 层时踩到了坑。具体描述如下:我使用 axios 实现登录功能,在将前端输入的登录信息传给 Controler 的时候,Controller 接收不到参数,但是却响应给了前端,此时的我脑海冒出一堆的问号。

技术图片

浏览器的网络和后台信息如下:

可以看出,我们的请求头中已经时是有发送数据的,但是我们后台接收到的却是null

技术图片

这里可以看到,服务器响应了我们刚刚发送的请求,并返回了响应信息

技术图片

一开始,我还是一头雾水,按照常理来说,请求头有数据,服务器也返回了响应,这代表请求响应的链路并没有出错,后台应该是能接收到数据的呀。我当时的第一反应是我的 axios 是不是使用错了?然后我去 axios 官网去查找,一无所获。但当我回去查开发者工具中网络那里的时候,发现到了一点端倪

如果我们再仔细一点,会发现我们的网络中其实是有两个请求其中一个是我们正常的 POST方法 请求,另一个则是 OPTIONS 方法请求

技术图片

这时我就十分疑惑了,因为我并没有见过这个 OPTIONS 请求方法。于是乎,我就百度去查这个 OPTIONS 请求方法究竟是什么。

然后在一篇博客中查询到了很多信息,博客地址:https://blog.csdn.net/kahhy/article/details/81563063

当浏览器在处理复杂跨域请求时,会在真正发送请求之前,会先进行一次预请求,请求方法就是刚刚我们看到的 OPTIONS 请求方法。如果在 OPTIONS 请求之后服务器返回了正确的http响应,则会进行第二次的真正的访问,若是接收到的是 500,404等错误http状态,则会停止第二次真正的http响应

看到这里,是不是突然恍然大悟,原来就是这个 OPTIONS 在作怪!我们的服务器并不是没有接收到参数,而是由于第一次的预请求,触发了 Controller 里的方法,第二次真正的请求就不会触发了 Controller 里的方法,而是直接获得这个方法的返回值

终于找到了我们后台接收不到数据的原因的,那么我们应该怎么去解决这个 OPTIONS 呢

我顺着这个思路,继续去查了百度(狗头),然后找到了解决方法,博客地址:https://blog.csdn.net/Revival_Liang/article/details/79016895

总结他博客的内容,就是把格式为 JSON 的参数用 qs 插件转换

在 main.js 中加入如下设置

/* 解决 axios options请求后台无法接收参数的问题 */
Vue.prototype.$qs = qs;

我使用了上面的方法,也还是遇到一些坑的,下面我就来总结一下使用 axios 后台无法接收到数据的解决方案


解决方案



  1. 在开发者工具中查看控制台是否有报错,网络中的请求是否有问题,若情况和我的差不多,则如下方法适用,否则很大概率是代码问题。这个解决方法的前提是请求响应链路是没有问题的



  2. 配置好跨域设置

    Vue中

    在 main.js 中加入如下配置

    // 引用axios和qs插件
    import axios from ‘axios‘
    import VueAxios from ‘vue-axios‘
    import qs from "qs";
    Vue.use(VueAxios, axios);
    // 设置基础URL为后端服务api地址,注:这里冒号里的,是后台 Tomcat 服务器启动的端口地址
    axios.defaults.baseURL = "http://127.0.0.1:8088";
    //设置全局,每次ajax请求携带COOKIEs
    // axios.defaults.withCredentials = true
    // 将API方法绑定到全局
    Vue.prototype.$axios = axios;

    后台

    配置 Tomcat,端口号和地址必须和 Vue 中设置的跨域端口号和地址一致,具体Tomcat配置步骤自行百度

    在 Controller 类上方添加 @CrossOrigin 注解

    @Controller
    @ResponseBody
    @CrossOrigin // controller 需要添加这个注解才能实现跨域请求或响应
    public class UserController {
    // 具体的代码

    @Autowired
    private UserService userService;
    @RequestMapping("/login")
    public String login(String userName,String password){
    System.out.println(userName);
    System.out.println(password);
    return "test";
    }
    }


  3. 将 qs 插件绑定到全局(由于 axios 自带 qs 插件,所以无须npm安装)

    在 main.js 中加入如下设置

    /* 解决 axios options请求后台无法接收参数的问题 */
    Vue.prototype.$qs = qs;


  4. 把格式为 JSON 的参数用 qs 插件转换

    找到解决办法后,我又在这里拆坑了,这步应该就是 解决使用 axios 后台无法接收到数据问题的核心,因为只有按这步来做,才能解决向服务器发送 OPTIONS 方法请求的问题。

    登录的完整代码如下,核心解决这个问题的代码是 axios 进行异步请求的那一段




  5. 设置过滤器

    这个也是核心的一步,但一般都不会忘记或者复制粘贴就行了



    • 创建过滤器 CrossFilter,并实现 Filter 接口

      package com.xp.filter;
      import javax.servlet.*;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      /**
      * axios跨域过滤器
      *


      * create by 2020-06-24 14:23
      *
      * @author xp
      */
      public class CrossFilter implements Filter {
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
      }
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
      HttpServletResponse respOnse= (HttpServletResponse) servletResponse;
      HttpServletRequest request = (HttpServletRequest) servletRequest;
      String myOrigin = request.getHeader("origin");
      // 设置请求头
      response.setContentType("textml;charset=UTF-8");
      response.setHeader("Access-Control-Allow-Origin", myOrigin);
      response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
      response.setHeader("Access-Control-Max-Age", "3600");
      response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
      response.setHeader("Access-Control-Allow-Credentials", "true");
      response.setHeader("P3P", "CP="NON DSP COR CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa CONa HISa TELa OTPa OUR UNRa IND UNI COM NAV INT DEM CNT PRE LOC"");
      response.setHeader("XDomainRequestAllowed", "1");
      chain.doFilter(request, response);
      }
      @Override
      public void destroy() {
      }
      }


    • 在 web.xml 中配置过滤器



      crossFilter
      com.xp.filter.CrossFilter


      crossFilter
      /*





  6. 测试

    到这里,基本就没有什么问题了。如果网络中还有 OPTIONS 请求方法,请检查下 qs 插件的配置和使用,如果是无法跨域请求或响应,java 代码方面,请检查 CrossFilter 过滤器的设置Controller 或者其方法中是否加了 @CrossOrigin 注解,Vue 方面,axios 跨域设置是否配置无误,比如说跨域的 Tomcat 服务器的地址和端口号是否一致。前面无误,若是后台无法接收参数,最可能被忽略的就是参数名称不一致的问题,然后是是否使用 sq 插件对 axios 中 json 数据进行转换



感谢大家观看,如果感觉有用的,可以点个赞,谢谢!


推荐阅读
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 利用Flask框架进行高效Web应用开发
    本文探讨了如何利用Flask框架高效开发Web应用,以满足特定业务需求。具体案例中,一家餐厅希望每天推出不同的特色菜,并通过网站向顾客展示当天的特色菜。此外,还增加了一个介绍页面,在bios路径下详细展示了餐厅主人、厨师和服务员的背景和简介。通过Flask框架的灵活配置和简洁代码,实现了这一功能,提升了用户体验和餐厅的管理水平。 ... [详细]
  • 题目:图像处理(HDU1828,计算周长并集,利用线段树与离散化技术进行扫描) ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 本文深入探讨了使用Puppet进行软件包分发与管理的方法。首先介绍了fpm这一跨平台的软件包制作工具,其简便的操作流程使得软件包的创建变得轻松快捷。fpm的项目地址为:https://github.com/jordansissel/fpm。通过结合Puppet和fpm,可以实现高效、可靠的软件包管理和部署。 ... [详细]
  • 为了向用户提供虚拟应用程序,通常会在基础架构中部署StoreFront或Web Interface。为了确保安全的远程访问,通常需要在DMZ中配置Secure Gateway或Access Gateway。本文详细对比了这两种界面工具的功能特性,包括用户管理、安全性、性能优化等方面,为企业选择合适的解决方案提供了全面的参考。 ... [详细]
  • React 实现 Post 请求下载 PDF 文件的解决方案
    在 React 应用中实现通过 POST 请求下载 PDF 文件的功能,本文提供了完整的代码示例。具体实现包括设置状态以显示加载提示,并通过控制台日志记录下载索引,确保请求的正确性和用户体验。此外,还详细介绍了如何处理响应流并将其转换为可下载的 PDF 文件,适用于需要安全传输数据的场景。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 深入探索Node.js新框架:Nest.js第六篇
    在本文中,我们将深入探讨Node.js的新框架Nest.js,并通过一个完整的示例来展示其强大功能。我们将使用多个装饰器创建一个基本控制器,该控制器提供了多种方法来访问和操作内部数据,涵盖了常见的CRUD操作。此外,我们还将详细介绍Nest.js的核心概念和最佳实践,帮助读者更好地理解和应用这一现代框架。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
author-avatar
cc晨晨V_842
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有