Jfinal拦截器传递调用后,controller对象无法通过getPara()获取请求参数

场景:我在拦截器里获取请求的参数,做相应的逻辑处理。然后再调用inv.invoke()传递调用给目标Controller,代码如下:

String readData = HttpKit.readData(controller.getRequest());

JSONObject object = JSON.parseObject(readData);

......

inv.invoke()

问题:Controller无法再通过getPara()获取请求参数。

评论区

潇洒太爷

2018-05-22 18:46

1、如果你提交的contentType为:application/json,那么后台取数据,就不是getPara,而是你拦截器那样HttpKit.readData(controller.getRequest())
2、request的body内容,只能读取一次,也就是说HttpKit.readData(controller.getRequest())只能读一次。

麻言

2018-05-27 14:48

这种机制很不好!不知道有没有好的解决办法:我也需要在“权限”拦截器中获取post数据,对数据进行权限验证,如:判断用户是否在新增一个数据到他人的名下,判断没问题后,交给控制器处理后续操作。表单提交的话,没事!因为这个拦截器根据actionKey判断不是“批量操作”进而不会调用readData。问题出现在“批量处理”的方法和数据上。我的现在自定义了一个“规范”,前端post数据(目前都是字符串、json型的),都用“postData”关键字指定,如$.ajax({ url:‘/couser/updateList’, data:{'postData':JSON.parse([……],[……], ……) } }) @JFinal

麻言

2018-05-27 15:01

补充1:我有考虑过拦截器中String jsonString = HttpKit.readData(controller.getRequest()) (语句1), 然后 controller.setAttr("postData",jsonString) (语句2)。控制器中的updateList方法就可以getAttr("postData")(语句3)获取数据。这似乎没毛病。但还是被放弃了。因为,拦截器中还有一些逻辑判断(如,超管豁免数据验证、特殊action豁免验证等等),导致没有执行 语句1和语句2,于是结果可想而知,语句3获得了null。

麻言

2018-05-27 15:17

补充2:那么,能否不管三七二十一,拦截器对批量操作直接执行语句1、语句2,然后控制器中不就可以用语句3了吗?乍一听,我也心动了,差点就赞同了。可是实践出真知:万万不可!因为还要考虑验证器和其他拦截器的感受!问题举例:我们即使使用post提交数据,url一般还会有一些用“?”挂的参数,这些是要交给验证器去验证的,难道验证器还要判断actionKey的类型是否为“批量操作”进而分类验证,因为验证器已经不能用getPara系列方法轻松获取这些参数了!……细思极恐!

JFinal

2018-05-27 21:53

@麻言 一直用 getPara 就可以了, HttpKit.readData(....) 仅用于 HttpClient OkHttp 这类 http 客户端将数据放在 http 请求体中的情况

一花一世界

2018-06-01 20:34

@JFinal 有点没明白,getPara无法拿到一楼那种情况的数据

LoveWalter

2018-07-10 16:21

嗯、我也遇到这种情况

losuai

2019-04-12 09:37

这种情况怎么解决

michael_yang

2020-07-19 16:53

同样拿不到数据

热门反馈

扫码入社