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);
}
2020-07-23 13:54
@Dirge jfinal.com 跑了 8 年从来没碰到过 JVM 挂掉的事, JVM 挂掉一般是项目代码本身有问题,例如 JNI 调用时出现野指针,内存泄露等等
2020-07-23 13:52
@1377205950 这个是为了防止攻击者上传 jsp 文件,然后直接请求 jsp 来攻击你的系统
虽然 jfinal 是阻止上传 JSP 文件的,但攻击者有各种办法来绕过上传,所以高版本才添加了这个安全防护
添加这个防护,必然是可以通过配置打开的,在 configConstant(Constants me) 中配置:
me.setDenyAccessJsp(false);
最后,在升级文档中也有过说明:
https://jfinal.com/doc/14-1
注意看上述文档中的第 13 小节