使用Ajax发送JSON字符串数据至Servlet问题指南(踩坑)

本文讲述了前端使用Ajax发起请求时遇到的跨域问题,包括预检请求的处理、JSON字符串传递导致的服务器处理问题。解决方法包括调整数据类型以避免预检请求,以及正确解析和提取服务器接收到的JSON数据。
摘要由CSDN通过智能技术生成

配置

前端:Ajax 请求
后端:Servlet
浏览器:edge

踩坑问题

1.跨域问题

在服务器端已添加响应头
在这里插入图片描述

预检请求状态为200,但是post请求不通过
在这里插入图片描述

2.服务器处理问题

将JSON字符串传递到后端,使用request.getParameter(" ")方法提取不到数据。

解决方案

1.跨域问题

当ajax传出的数据类型为’application/json’(即JSON字符串类型) 时,会附带提交预检请求
在这里插入图片描述

但如果传出的数据类型为对象,则不会提交预检请求,且会直接通过
在这里插入图片描述

抓包显示未提交预检请求,且post请求通过
在这里插入图片描述

所以问题原因在预检请求,下面我们看预检请求具体细节
在这里插入图片描述

我们看到响应表头中并未出现我们先前添加的Access-Control-Allow-Origin,问题原因暂未找到,直接提供解决方法(较为暴力) 。

使用edge中的插件CORS Unblock
在这里插入图片描述

其功能为:将更改浏览器收到的每个请求的“Access-Control-Allow-Origin”和“Access-Control-Allow-Methods”标头来绕过“XMLHttpRequest”和“fetch”拒绝。

也就是为我们自动添加标头,以解决标头添加失败问题。

启动插件后:
在这里插入图片描述
在这里插入图片描述
可见,预检请求的“Access-Control-Allow-Origin”和“Access-Control-Allow-Methods”标头被正确添加,问题解决(只适用于开发环境,并不算真正地解决问题,比较暴力)。

2. 服务器处理问题

踩坑原因

当我向后端传入JSON字符串时,在后端中提取数据的代码为
在这里插入图片描述

当检查日志时,发现两个变量值均为NULL,因此,.getParameter(" ")方法提取不出request对象中的数据。
经查询与试验,

  • 当前端传出数据类型为对象时,.getParameter(" ")方法适用,
  • 当前端传出数据类型为JSON字符串类型时,需要使用BufferedReader来读取request对象,将其转化为字符串,再将JSON 字符串解析为 JSON 对象,从而使用.getString(" ")方法提取数据

解决方案

        // 从请求中获取 JSON 字符串
        StringBuilder sb = new StringBuilder();
        String line;
        BufferedReader reader = request.getReader();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        String jsonString = sb.toString();

        // 将 JSON 字符串解析为 JSON 对象
        JSONObject json = null;
        try {
            json = new JSONObject(jsonString);
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

        // 提取 username 的值
        String username = null;
        String password = null;

        try {
            username = json.getString("username");
            password = json.getString("password");
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

        boolean success = "admin".equals(username) && "123".equals(password);

        JSONObject jsonResponse = new JSONObject();
        try {
            jsonResponse.put("success", success);
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }

        response.getWriter().write(jsonResponse.toString());
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值