2020-07-24 21:43
@大大咧咧 还得麻烦你再多试几个,尤其是 renderQrCode("abc")
这个是输出二维码的,很重要
2020-07-24 21:36
@大大咧咧 幸好你提出来了,正要发布新版本 jfinal 4.9.01 到 maven 中心库,你迟一点就晚来一步了 ^_^
2020-07-24 16:53
@大大咧咧 感谢支持
由于 TextRender 已添加了 flush(), 所以我现在最关心的是 TemplateRender 是否有此问题
希望你能在你出问题的机器上进行这个测试,如果 TemplateRender 也有问题,那就也要添加
有可能与电脑也有关系,要在你出问题的那台电脑上测试
2020-07-24 14:59
这个应该是与其它 Render 的 OutputStream.flush() 一起注掉的,主要是因为跟踪到 tomcat、jetty 容器底层,发现它们本身就有一个 flush()
所以 jfinal 中减少一次 flush() 可以提升性能
而 TextRender 面对的是 Writer 而非 OutputStream,或许有些底层容器并没有及时 flush()
请问你用的哪个容器,是不是 undertow? 我还得看看它的源码
此外,由于这个地方不能非分百保障所有容器都及时 flush,所以 jfinal 也只是先注释,并没有删掉这行代码
刚刚已经去除了注释:
https://gitee.com/jfinal/jfinal/commit/ae0c988bc3387981ceb62ebe36abf85d920828b6
2020-07-24 12:08
做到 jfinal 内部,可能会失掉一些通用性,所以暂时建议扩展一下,起码有如下方式扩展,任选其一:
1:通过实现 com.jfinal.core.paragetter.ParaGetter.java 这个接口扩展一个支持 json 的类,例如:
public class JsonMapGetter extends ParaGetter {
public JsonMapGetter(String parameterName, String defaultValue) {
super(parameterName, defaultValue);
}
public T get(Action action, Controller c) {
return to(c.getRawData());
}
protected T to(String v) {
return v != null ? FastJson.getJson().parse(v, Map.class): "null";
}
}
然后注册一下:
ParaProcessorBuilder.me.regist(Map.class, JsonMapGetter.class, null);
用的时候这样:
public class MyController extends Controller {
public void index(Map jsonMap) {
...
}
}
上面的扩展可以将 json 数据转成 Map 类型,你希望支持哪种类型就像上面的这样扩展,当然,上面的扩展还可以更更完善,例如在 get(Action, Controller) 方法中判断当前请求是否为 application/json, 分情况采取不同的处理方式会更灵活
2: 通过引入一个public class BaseController extends Controller, 在其中添加一些你常用到的 getXxx 方法,转成希望的类型,配合 getRawData() 可以很方便获取 json 数据
2020-07-24 11:44
我再多谈一点这个结构在安全性上的考虑,传统打成的 WAR 包这类方案,其配置文件与 jar 包会打到 webapp/WEB-INF 下面,例如:
webapp/WEB-INF/classes
webapp/WEB-INF/lib
而生产环境下很多都会使用 nginx 还对 webapp 下的 web 资源进行反向代理,nginx 中通常有下面一行配置:
root /my-project-path/webapp/
然后,恶意攻击者就可以通过在浏览器中输入 http://域名/WEB-INF/lib/xxx.jar 以及 http://域名/WEB-INF/classes/app-config.txt 下载你的 jar 包和配置文件了
你的数据库密码之类的也可以分分钟泄漏
你的 jar 包被下载以后可以被反编译,拿到你的业务源代码,进而可以进一步深入攻击
你得再配置 nginx 的 location 来阻止这种访问才能避掉这个坑
而 jfinal 的打包方式完全不存在这个问题,因为 config、lib 并没有放在 webapp 之下,极度安全
2020-07-24 11:37
@Dirge 浏览一下打包后的目录:
0:根目录下是启动脚本
1:config 下是配置文件
2:lib 下是依赖的 jar 包以及项目本身源码打成的 jar 包
3:webapp 下是 web 资源,例如 html、js、css、图片等等
这个结构几近完美,是经过多年经验总结与微调后的精心设计,你不可能找到比这个更爽的打包结构
2020-07-23 20:24
@谢 应变是你的定时任务启动比 ActiveRecordPlugin 要早,而线程调度的时间不是严格确定的,所以时好时坏
解决办法是在 configPlugin 中先添加 ActiveRecordPlugin,再添加 Cron4jPlugin:
configPlugin(Plugins me) {
me.add(arp);
me.add(cron4jPlugin);
}