jfinal全局数据拦截器

封装json体。依赖 fastjson。需要的拿走。

此拦截器不处理带文件表单,请自行修改。

import com.alibaba.fastjson.JSONObject;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class DatagramInterceptor implements Interceptor {

    private static final Logger log = LoggerFactory.getLogger(DatagramInterceptor.class);

    @Override
    public void intercept(Invocation inv) {
        Controller controller = inv.getController();
        process(controller.getRequest());
        inv.invoke();
    }

    public void process(HttpServletRequest request) {
        if (request.getAttribute("_params") != null) {
            return;
        }
        //如果是上传文件跳过
        if (StrKit.notBlank(request.getContentType()) && request.getContentType().contains("multipart/form-data")) {
            return;
        }

        try (ServletInputStream is = request.getInputStream()) {

            byte[] bytes = new byte[is.available()];

            is.read(bytes);

            String str = new String(bytes, "UTF-8");
            JSONObject jsonObject = JSONObject.parseObject(str);
            request.setAttribute("_params", jsonObject);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

image.png

前端ajax调用示例:

var json = {
	"id": id
}
//相关推荐推荐
$.ajax({
    type: "post",
    url: '/hello',
    data: JSON.stringify(json),
    dataType:"json",
    async: true,
    success: function (res) {
        console.log("请求成功");
    },
    error: function (e) {
        console.log('数据返回失败')
    }
});

后台代码:controller中实现

image.png



评论区

JFinal

2018-12-26 17:53

ServletInputStream 读数据这一段,建议一个小改进:
String str = inv.getController().getRawData();

感谢分享

JFinal

2018-12-26 17:54

getRawData() 这个方法可以反复调用,所以 if (request.getAttribute("_obj") != null) 这个判断可以省去了

zhangshiqiang

2018-12-26 17:57

@JFinal 之前用 BufferedReader 调用,然后会把 \r \n 消除掉,所以采用了 字节流方式

zhangshiqiang

2018-12-26 17:58

@JFinal
try (BufferedReader reader = request.getReader()) {
StringBuilder sb = new StringBuilder();
String str = null;
while ((str = reader.readLine()) != null) {
sb.append(str);
}
JSONObject jsonObject = JSONObject.parseObject(sb.toString());
log.debug("jsonObject is : " + jsonObject);
request.setAttribute("_obj", jsonObject);
} catch (IOException e) {
e.printStackTrace();
}

比如我的字段 context 中 带 换行符 \r\n 通过这种转换后就消失了。

JFinal

2018-12-26 19:23

@zhangshiqiang 那个是很老的版本了,新版本中的 HttpKit.readDate 会保留 \n, 但是 \r 是会扔掉的,对于 json 来说有 \n 就够了,linux、windows 下通用

zhangshiqiang

2018-12-26 19:48

@JFinal app项目 发类似朋友圈的信息的时候 需要保留 \r \n 等原有样式。

静态代码块

2018-12-27 16:26

厉害,不过建议先在hander中 解析 然后放在ParaGetter 中,这样就在拦截器中 可以直接ivc.getAsg(索引) 获取, 方法上也能直接带参赋值