• SpringBoot 与 ajax


    不同的传递方式(POST & GET)会将传递的数据存储到不同的位置,而针对不同的存储位置而言后端读取的方式也是不一而同的。

    我先说明一下问题场景:我在edit.HTML 界面中用自定义的脚本配合控件使用ajax函数进行提交数据

    脚本长这样

    /**
     * 保存
     */
    function saveForm() {
        console.log($("#fm").serialize());// 序列化
        var data = {
                'id' : $('input[name="id"]').val(),
                'powerFreq' : $('input[name="powerFreq"]').val(),
                'ratedVol' : $('input[name="ratedVol"]').val()
        };
        console.log(JSON.stringify(data));// json转化为字符串
        $.ajax({
            url : '/mes/ratedVolPowerFreq/save',
            type : 'GET',/*POST*/
            contentType : 'application/json',
            dataType : 'json',
            data : data,/*JSON.stringify(data),*/
            success : function(result) {
                if (!result.success) {
                    showAlertDlg('保存失败!' + result.message);
                    return;
                }
                layer.msg('保存成功!', {
                    icon : 1,
                    time : 1000
                }, function() {
                    window.location.href = '/mes/ratedVolPowerFreq/list';
                });
            }
        });
    }

    当我们使用GET方法进行数据提交的话

    Springboot controller层接收数据部分长这样

        /**
         * 保存功能
         * @throws IOException
         * @throws UnsupportedEncodingException
         */
        @RequestMapping(value = "/save")
        @ResponseBody
        public JsonResult<String> Save(@RequestParam(value = "id") Integer id1,@RequestParam(value = "powerFreq") Double powerFreq,@RequestParam(value = "ratedVol") Double ratedVol){
            System.out.println("+++++++++++++++++++++++++++++++++");
            System.out.println(id1);
            System.out.println(powerFreq);
            System.out.println(ratedVol);
            boolean test = true;
            if (test) {
                return new JsonResult<>(false,"傻逼 Σ(☉▽☉‘a");
            }
            System.out.println("+++++++++++++++++++++++++++++++++");
        }

    注意:这种ajax方法传递中数据部分可以使用Json数据、也可以使用序列化$("#fm").serialize()字符串 但是!!!不能是JSON.stringify(data)不然回报Invalid character found in the request target. 

    但是!

    我们使用使用ajax-POST方法进行数据提交的时候

    就会一直报错:Required Integer parameter 'id' is not present

    /**
     * 保存
     */
    function saveForm() {
        console.log($("#fm").serialize());
        var data = {
                'id' : $('input[name="id"]').val(),
                'powerFreq' : $('input[name="powerFreq"]').val(),
                'ratedVol' : $('input[name="ratedVol"]').val()
        };
        console.log(JSON.stringify(data));
        $.ajax({
            url : '/mes/ratedVolPowerFreq/save',
            type : 'POST',
            contentType : 'application/json',
            dataType : 'json',
            data : JSON.stringify(data),
            success : function(result) {
                if (!result.success) {
                    showAlertDlg('保存失败!' + result.message);
                    return;
                }
                layer.msg('保存成功!', {
                    icon : 1,
                    time : 1000
                }, function() {
                    window.location.href = '/mes/ratedVolPowerFreq/list';
                });
            }
        });
    }

    SpringBoot - controller层

        /**
         * 保存功能
         * @throws IOException
         * @throws UnsupportedEncodingException
         */
        @RequestMapping(value = "/save")
        @ResponseBody
        public JsonResult<String> Save(@RequestBody RatedVolPowerFreq curRVPF){
            Integer id = curRVPF.getId();
            if (id == null) {
                curRVPF.setCreator(SessionUtils.getLoginUser());
                curRVPF.setCreateTime(DateUtils.getCurDate());
                curRVPF.setModifyTime(DateUtils.getCurDate());
                ratedVolPowerFreqService.insert(curRVPF);
            }else {
                RatedVolPowerFreq temRVPF = ratedVolPowerFreqService.findById(id);
                temRVPF.setRatedVol(curRVPF.getRatedVol());
                temRVPF.setPowerFreq(curRVPF.getPowerFreq());
                temRVPF.setModifyTime(DateUtils.getCurDate());
                ratedVolPowerFreqService.update(temRVPF);
            }
            return new JsonResult<>(true,"保存成功!");
        }

    注意:这种ajax方法传递中数据部分禁止使用Json数据和序列化$("#fm").serialize(),回报:Unrecognized token 'id': was expecting ('true', 'false' or 'null')(无法识别“id”)的错误,

    只能使用JSON.stringify(data)进行传递数据

    关于http ajax操作的两种方法详解

    两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。

    • GET - 从指定的资源请求数据
    • POST - 向指定的资源提交要处理的数据

    GET 基本上用于从服务器获得(取回)数据。注释:GET 方法可能返回缓存数据。

    POST 也可用于从服务器获取数据。不过,POST 方法不会缓存数据,并且常用于连同请求一起发送数据。

    Get和Post都是向服务器发送的一种请求,只是发送机制不同。

    1. GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器。当然在Ajax请求中,这种区别对用户是不可见的。

    2. 首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。

    3. GET方式请求的数据会被浏览器缓存起来,因此其他人就可以从浏览器的历史记录中读取到这些数据,例如账号和密码等。在某种情况下,GET方式会带来严重的安全问题。而POST方式相对来说就可以避免这些问题。

    get请求和post请求在服务器端的区别:

    4. 在客户端使用get请求时,服务器端使用Request.QueryString来获取参数,而客户端使用post请求时,服务器端使用Request.Form来获取参数.

    HTTP标准包含这两种方法是为了达到不同的目的。POST用于创建资源,资源的内容会被编入HTTP请示的内容中。例如,处理订货表单、在数据库中加入新数据行等。

    当请求无副作用时(如进行搜索),便可使用GET方法;当请求有副作用时(如添加数据行),则用POST方法。一个比较实际的问题是:GET方法可能会产生很长的URL,或许会超过某些浏览器与服务器对URL长度的限制。

    若符合下列任一情况,则用POST方法:

    * 请求的结果有持续性的副作用,例如,数据库内添加新的数据行。
    * 若使用GET方法,则表单上收集的数据可能让URL过长。
    * 要传送的数据不是采用7位的ASCII编码。

    若符合下列任一情况,则用GET方法:

    * 请求是为了查找资源,HTML表单数据仅用来帮助搜索。
    * 请求结果无持续性的副作用。
    * 收集的数据及HTML表单内的输入字段名称的总长不超过1024个字符。

    对比

    有关 GET 请求的其他一些注释:

    • GET 请求可被缓存
    • GET 请求保留在浏览器历史记录中
    • GET 请求可被收藏为书签
    • GET 请求不应在处理敏感数据时使用
    • GET 请求有长度限制
    • GET 请求只应当用于取回数据

    有关 POST 请求的其他一些注释:

    • POST 请求不会被缓存
    • POST 请求不会保留在浏览器历史记录中
    • POST 不能被收藏为书签
    • POST 请求对数据长度没有要求

    下面的表格比较了两种 HTTP 方法:GET 和 POST。

     GETPOST
    后退按钮/刷新 无害 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
    书签 可收藏为书签 不可收藏为书签
    缓存 能被缓存 不能缓存
    编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
    历史 参数保留在浏览器历史中。 参数不会保存在浏览器历史中。
    对数据长度的限制 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 无限制。
    对数据类型的限制 只允许 ASCII 字符。 没有限制。也允许二进制数据。
    安全性

    与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。

    在发送密码或其他敏感信息时绝不要使用 GET !

    POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
    可见性 数据在 URL 中对所有人都是可见的。 数据不会显示在 URL 中。
  • 相关阅读:
    搭建VueMint-ui框架
    vue项目创建
    jQuery选择器总结
    位运算
    Hash哈希
    并发编程(六)并发容器
    并发编程(五)AQS
    并发编程(四)显示锁
    Java中的几种代码块
    并发编程(三)原子操作CAS
  • 原文地址:https://www.cnblogs.com/supperlhg/p/9327996.html
Copyright © 2020-2023  润新知