前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

这篇具有很好参考价值的文章主要介绍了前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

bug背景

项目中采用富文本编辑器后传参引起的bug,起因如下:
前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端
前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端
数据库中存入的数据会变成这种未经转码的URL编码

前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端


解决思路1:

使用JSON方式传参,但富文本编辑器不支持将内容转成JSON,会遗失标签,显然不符合把富文本文章存入数据库的需求,所以PASS


解决思路2

使用URL拼接方式传参,而缺点也是明显的,URL拼接的参数长度有限,用户就不能编写长文本了。
且用此种方法,后端接收到的数据依旧会因特殊字符而转码失败(不知道是不是框架MVC配置的拦截器逻辑有问题,遇到特殊字符后就不去处理了),用URLDecoder.decode方法手动转码又过于不优雅,也不符合高可用的理念

前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端


解决思路3(最终解决方案)

前端使用URLSearchParams 对象以键值对方式传参
似乎是目前比较合适的解决方法

// 创建URLSearchParams对象,将参数用append方法以键值对一个个放入
const params = new URLSearchParams();
    params.append('key1', 'value1');
    params.append('key2', 'value2');

URLSearchParams 对象参考:【JS】URLSearchParams 对象(以对象的形式上传参数到url)
需要考虑各浏览器兼容性问题和解决方案

vue3前端请求方法:

const onSubmit = async function (formEl: FormInstance | undefined) {
  console.log(formEl)

  formEl.validate(async valid => {
    if (valid) {
      try {
        const params = new URLSearchParams()
        params.append('content.content', form.contentStr)
        params.append('destId', form.destId.toString())
        params.append('title', form.title)
        params.append('travelTime', form.travelTime)
        params.append('coverUrl', form.coverUrl)
        params.append('isPublic', form.isPublic ? '1' : '0')
        params.append('person', form.person)
        params.append('days', form.days)
        params.append('avgConsume', form.avgConsume)
        params.append('summary', form.summary)
        // let params = {
        //   destId: form.destId,
        //   title: form.title,
        //   travelTime: form.travelTime,
        //   coverUrl: form.coverUrl,
        //   isPublic: form.isPublic ? '1' : '0',
        //   person: form.person,
        //   days: form.days,
        //   avgConsume: form.avgConsume,
        //   summary: form.summary,
        //   contentStr: form.contentStr
        // }
        //params['content.content'] = params.contentStr
        const res = await travelsAdd(params)
        ElMessage.success('提交日志成功')
        router.push('/personal/travels')
      } catch (err) {
        console.log(err)
        ElMessage.error(err.msg)
      }
    } else {
      return false
    }
  })
}

前端控制台:
前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端

后端请求接收,富文本context数据正常

前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端
前端传参转码,vue,项目中的开发思路,经验分享,spring cloud,vue,前端

写入数据库正常,大功告成~!


后记

自从成为全栈后感觉思考问题和找bug的视野更广了,写代码也觉得越来越有趣,越来越顺畅。相信自己选择的路,即使它不一定对,只要努力让自己不后悔就好。学有所成,劳有所获,加油~!文章来源地址https://www.toymoban.com/news/detail-822307.html

到了这里,关于前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端post,get请求传参方式 以及后台接收

    post请求: 1:js中 2:使用 首先引入方法js: 调用方法 3:浏览器请求 4:后台参数接收 get请求: 第一种:通过params对象传递,将参数以键值对的形式传递,当传递的参数为多个时,浏览器会自动拼接进行分割 1:js中 2:使用 首先引入方法js: 调用方法 3:浏览器请求 4:后台

    2024年02月10日
    浏览(44)
  • 前端传值,java后端接收

    var arr = [ 0, 1, 2]; var myJSON = JSON.stringify(arr); 此时myJSON字符串就是’[0,1,2]\\\',传给后台接受 前端 后端方法1(使用spring注解@RequestBody接收): 后端方法1的对象UserDto 后端方法2(使用JSON.parseArray()把前端 [{“loginAct”:111,“loginPwd”:1111},{“loginAct”:222,“loginPwd”:2222}] 数据转化为LI

    2024年02月13日
    浏览(41)
  • vue组成部分:前端后端调用方法传参(实操基础版)

    前言     前后端传递信息,POST、Get方法,精简版     在 RestFul API 中,前后端是分离的,后端不在负责视图的渲染,只负责返回指定的前端请求后端 Rest 风格的 API,后端接收到前端的请求之后,会根据请求方法类型,参数执行一些对应的操作。然后返回 JSON 格式的数据给

    2023年04月23日
    浏览(41)
  • springboot后端接收前端传来的数组

    1 使用@RequestParam 接收数组 postman测试: 2 使用@RequestBody 接收 postman测试: 注意要在请求体 body 中传 json 字符串。 结果: 删除前: 删除后: 两者的区别: @RequestBody接收前端传来的 请求体 中的字符串 因为get请求是没有请求体的,所以前端发送请求时要以post的方式发送 @Req

    2024年01月19日
    浏览(39)
  • springboot后端接收前端传数组参数方法

    与@RequestBody不同,@RequestParam传递的数组中有多少个值,便排排下来写便是 (注意微操,参数名需为key的名称为@RequestParam括号里的名称,而不是定义的数组名)

    2024年02月16日
    浏览(43)
  • SpringBoot前端传递数组后端怎么接收

    在Spring Boot中,前端传递数组到后端的方式可以有多种。以下介绍两种常用的方法: 使用@RequestParam接收数组参数: 前端可以通过URL参数的形式传递数组,后端使用@RequestParam注解来接收数组参数。 示例代码: 前端请求示例: 在URL参数中使用相同的参数名(如arrayParam),Sp

    2024年02月04日
    浏览(49)
  • 前端传递Json格式,后端如何用多种方式接收

     一、先定义一个简单的实体类 二、编写前端传递的json数据 1.前端传递普通json,后端用对象接收 2.前端传递json数组, 3.前端传递json数组,后端用集合接收Josn数组

    2024年02月12日
    浏览(50)
  • 前端接收后端数据时,遇到精度丢失的问题

    之前项目开发过程中遇到过前端接收后端数据时,遇到精度丢失的问题。当时进行了问题记录,本篇博客针对于这个问题进行问题原因并进行多种方式解决这个问题。 前端接收后端返回的数据时出现精度丢失问题,通常是因为在数据传输过程中,数据类型被转换为了 JavaScr

    2024年02月02日
    浏览(69)
  • 后端返回图片,前端接收并显示的解决方案

    后端通过二进制流的形式,写入response中 controller层 service层 axios接受数据时,responseType 默认返回数据类型是 json,必须将其改为返回数据类型 blob。否则axois无法正确解析数据。 这里的http.request是对axios的封装,把他当作axios用就行 vue界面渲染 后端接口,最好不要有返回值,

    2024年02月12日
    浏览(59)
  • 【前端】WebSocket接收二进制数据转JSON并解决中文乱码问题(ArrayBuffer转json)

    WebSocket与mqtt服务器通信,接收二进制数据并将其转为Json使用。一般方式都会出现中文乱码问题。

    2024年01月22日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包