版本5.0 : 拦截器无法获取renderJson()的jsonText

项目需要有操作日志记录功能,需求是记录用户访问ACTION的入参和反参,于是采用拦截器实现,搜了一下,拦截器中一般这样实现获取action的返回值:

inv.invoke();// 在此之后进行下方的日志记录

Render render = inv.getController().getRender();

if (render instanceof JsonRender) {

    JsonRender jr = (JsonRender)render;

    String jsonText = jr.getJsonText();

问题来了:

如果Controller中是renderJson(String jsonText),拦截器可以获取ACTION返回的jsonText;

如果Controller中是renderJson(String[] attrs),这时候上述拦截器代码获取不到jsonText了....

评论区

杜福忠

2022-12-01 16:25

记录参数用Handler 设置自建的 HttpServletResponse 》getWriter() 自建的PrintWriter想记录啥就记录啥

JFinal

2022-12-01 18:21

@杜福忠 这个办法比较有新意,以前没发现有人这么玩过

JFinal

2022-12-01 21:16

还有很多办法,方法一:
通过 JsonRender.gAttrs()、getJsonText() 获取必要数据,参考 JsonRender.buildJsonText() 中的代码去生成 json 来使用,这个会额外消耗性能

方法二:
继承 JsonRender 做一个 MyJsonRender,覆盖其中 buildJsonText() 方法,将方法声明中的 protected 改为 public:
public void buildJsonText() {
super.buildJsonText();
}
然后在拦截器中大致这么用:
if (render instanceof MyJsonRender) {
MyJsonRender mjr = (MyJsonRender)render;
if (getJsonText() == null) {
mjr.builderJsonText();
String json = getJsonText();
}
}

以上的 json 对象就得到了最终的 jsonText() 并且还不影响性能

方法二扩展的 MyJsonRender 可以放在 BaseController 中,通过覆盖父类的 renderJson 来实现,也可以更彻底通过扩展 RenderFactory 来实现切换,具体看下文档或者源代码

stoneric

2022-12-02 10:52

@JFinal 在没看到回复前用的方法一去解决的,感谢~~~

stoneric

2022-12-02 10:53

@杜福忠 嗯,这个更底层些~感谢回复~