关于JFinal中对应Content-Type为application/json,text/json的ajax请求参数处理

    ajax传json或在后端通过HttpPost提交请求时,设置的Content-Type:application/json或者text/json时,request.getParameter()并不能取到对应的参数,就会导致JFinal的Controller中getPara()方法也无法取到对应的参数。我对对Final稍加改动可轻松应对json请求参数。

    图片.png

            (这是我的请求头)        

    图片.png

    (这是请求参数)

以上截图来自firebug 证明前台 js 准确无误,但是后台却接收不到requst的parameter

图片.png

调查原因发现原来是request没法获取到请求参数,那么对应的getpara方法自然也就无法获取到对应的请求参数;查阅资料发现springMvc中又通过注解解决这一现象。(想了解自己去百度)但是jfinal开发中突然遇到这个问题,很是棘手,前台代码来自于bootstrap-table框架,不方便修改content-type,所以只能分析后台,通过对http请求的分析,如果,我们锁定了request的content-type,无论什么请求的参数都可以暴力读取。所以在jfinal源码中的HttpKit中找到了如下方法。

图片.png

这个时候问题也就迎刃而解了。

下面对于该问题解决提出4种策略。

  1. 直接读取方法

    我们在controller中已知某个请求的参数会是以上类型而且无其他杂项的时候,直接 读取

    图片.png

    图片.png

    我们通过输出发现json被读取了出来。

  2. 通过配置Handler来对这种类型数据预处理

    图片.png

    通过Handler预处理这种json数据然后在controller中通过获取Attr的方式获取对应的数据

    图片.png

  3. 通过配置Interceptor预处理

    图片.png

    其他跟上一方法一样。

  4. 写BaseController,当一个项目中大量使用这种交互的时候,又不是所有成员都对这个问题很了解的时候,建议这样用

    图片.png

    添加这样的抽象类。让所有Controller继承BaseController并且在Controller中重载getPara系列方法,只要判断一下是不是以上类型的content-type,这样所有成员操作变量习惯不改变,问题也得到解决

    图片.png

    图片.png

    一样输出正确结果。

关于这个问题,有想深入探究可以自行了解HTTP协议,content-type等相关知识,博主希望大家以后能绕过这个坑,不要像我整了一个下午,才弄明白,所以给大家分享点知识,关于这个情况没有遇到的也可以自己编写ajax请求去测试。谢谢大家观看,希望有帮到大家哦!

评论区

mutolee

2017-03-23 13:44

感谢分享,随后慢慢看

让太阳把我煮熟

2017-03-27 10:24

哈哈,我也遇到这种情况,差不多也是楼主这样解决的,但是并没有总结分享,感谢分享,我要向楼主学习

一去二三里

2017-09-25 15:32

完美解决了我的问题,

djs19960601

2017-09-26 17:53

@一去二三里 恩恩,这个应该是通病。

Fancye

2017-09-29 17:43

可以直接使用HttpKit.post(url, Map, null);

djs19960601

2017-09-30 11:01

@Fancye 这个不是发送请求么,接受参数用这个?我读书少,你别骗我

utopia

2017-11-16 18:38

antd+dva后台通信,正好碰到这个问题

简单代码

2018-10-24 21:48

@JFinal 应该解决这个问题了,现在使用JSON传数据的场景越来越多,我也是被坑了一下午才求助度娘发现问题的。

JFinal

2018-10-25 01:28

@简单代码 jfinal 3.5 已经提供了 getRawData() 来获取 json 数据了

热门分享

扫码入社