解决action请求链接过长,参数过长

 解决方法是使用JSON格式传递参数,但要注意JSON格式的后台获取的方法
正常的post请求(不包括ajax请求)在http头中的content-type为application/x-www-form-urlencoded,这时在java后台可以通过request.getParameter(name)的形式获取.但是通过原生ajax请求时,在java后台通过request.getParameter(name)的形式却无法获取到传入的参数.

原因是原生ajax请求时,在http头中的content-type为text/plain;charset=UTF-8.当请求到达tomcat服务器时,服务器只对application/x-www-form-urlencoded形式的http,post请求进行读取body体中的参数,并放到request的parameter中,对于原生ajax请求则直接忽略,不会读取body体中的参数,才导致request.getParameter(name)读取不到参数.

这样有两种方式解决

第一种,通过json传递数据,在java后台,用下面java代码读取RequestPayload的参数,就可以获取到传入的参数

// 前台

jQuery.ajax({

url: url,                // 访问地址

type: "POST",    // post提交

data: JSON.stringify(parm),  // 对象参数转换json格式字符串

contentType: "application/json;charset=UTF-8",   // http content type

dataType: "json",                        // 指定json格式

success: function (data) {

    // do success

},

error: function (error) {

   //do error

}

});


// 后台-获取到的是多个参数的json格式字符串,通过gson转换成map对象,即可以通过键值对方式去的想要的参数

public String getRequestPayload(HttpServletRequest req) {

        StringBuilder sb = new StringBuilder();

        try {

        BufferedReader reader = req.getReader();

char[]buff = new char[1024];

int len;

while((len = reader.read(buff)) != -1) {

        sb.append(buff,0, len);

}

        } catch (IOException e) {

        e.printStackTrace();

        }

        return sb.toString();

}

第二种, 在前台传递参数的时候用对象,并指定content-type为application/x-www-form-urlencoded

// 前台

var parm = {

param1 : "1",

param2 : "2"

};


jQuery.ajax({

url: url,                // 访问地址

type: "POST",    // post提交

data: parm,  // 对象转json字符串参数

contentType: "application/x-www-form-urlencoded",   // http content type

success: function (data) {

       // do success

},

error: function (error) {

      //do error

}

});

后台通过request.getParameter(name)方式就可以获取到参数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值