JsonRender的render() 方法中为什么设置response.setHeader("Cache-Control", "no-cache");

JsonRender的render() 方法中为什么设置response.setHeader("Cache-Control", "no-cache");

如何修改 response中 "Cache-Control" 的值,尝试了在拦截器中进行修改但是拦截修改后还是会被覆盖,因为render方法最后执行。

评论区

JFinal

2017-02-23 22:15

大部分情况下,客户端获取到的 json 数据是动态的,并不希望被浏览器缓存,所以 JsonRender 中添加了 "Cache-Control" 配置

解决的办法极其简单:
1:创建一个class MyJsonRender extends JsonRender,覆盖掉父类中的 render() 方法,去掉其中的 setHeader 调用
2:创建一个 class MyRenderFactory extends RenderFactory,覆盖掉其中的 getJsonRender() 方法,在方法体内使用 render new MyJsonRender(...)
3:在 configConstant(Constants me) 中通过 me.setRenderFactory(new MyRenderFactory()) 切换为自己的实现类

通过以上方法可以替换任何 Controller 中的 render 方法所依赖的实现类

TonyWang

2017-02-24 11:15

我使用JFinal做后台跟客户端(Android客户端使用Volley,缓存时要求后台返回的头信息中“Cache-Control”不能为"no-cache")进行json数据交互,在不少情况下列表数据是需要无网时缓存的(如朋友圈、微博等信息流)。个人觉得,为了使源码自生类更具有扩展性还是不要在JsonRender中进行设置是否缓存的好,让程序员根据需要自行设置。
而且,我尝试过创建自定义MyJsonRender extends JsonRender,但是在重写父类的render方法覆盖的时候,有一些参数是private获取不到,因而不可行。
我的解决方案是:
1.自定义MyJsonRender类,此类直接copy自JsonRender,然后修改render方法。
2.在需要缓存的接口中,使用render(new MyJsonRender());
当然大部分情况还是不需要缓存的,比如增删改操作,此时仍使用renderJson();即可。
个人见解。

JFinal

2017-02-24 11:30

@TonyWang 这样扩展也挺好,Controller.render(Render) 这个方法就是为这类场景设计的

是否要使用 "Cache-Control" 这个在最初的版本的确也纠结过,忘了当时做这个决定的关键原因了

热门反馈

扫码入社