2020-06-05 21:51

异常信息已经很清楚:
java.lang.NoSuchMethodError

这种异常是 java 基础知识,多个同样功能的 jar 包冲突,或者 jar 包版本不对

使用下面方法检查:
1:打开 eclipse 中的项目

2:按快捷键: ctrl + shift + t, 会弹出一个 Open Type 对话框。如果弹不出来,在工具栏点按那个 "文档夹上面有两个不同颜色小球" 的按钮,也可弹出 Open Type 对话框

3:在对话输中输入:javax.servlet.ServletRequest

4:键盘方向键向下键,进入下方的列表

5:盯着列表下面的显示 jar 包名的的那一栏字,能找出该 javax.servlet.ServletRequest 类在多个 jar 包中出现

6:打开 pom.xml 使用 exclusions 标签去除掉重复的 jar 包

如果不是你要答辩,这么基础的问题我是不可能回复的

2020-06-05 15:03

@山东小木 密码 hash 只需要下面的方法就足够了:
String salt = HashKit.generateSaltForSha256();
password = HashKit.sha256(salt + password);

上面的用法是非常专业的方式,并不需要二次 hash。


最核心是下面几点:
1:一定要使用随机盐,用于防止彩虹表攻击

2:使用 sha256 而不是 md5,用于防止 hash 碰撞攻击。md5 已被中国数学家王小云破解,不再安全

3:sha512 更安全但hash值太长,sha256 足够安全 hash 值不是太长。所以 sha256 是最优方案。如果你的系统不是银行类的,采用 sha256 足够了,否则可以采用 sha512。

4:不要使用自己创造的 hash 算法,除非你是极度专业的该领域的专业人士,否则反而容易被破解。

5:不必使用二次 hash,二次 hash 并不能带来安全性的提升


jfinal club 采用的密码 hash、存储方案建立在作者大量、细致的调研,是十分专业的方案。

2020-06-05 14:31

@xiuxiu-xiuxiu 为啥还在使用如此老的版本? 强烈建议升级到最新版本,这里有升级文档:
https://jfinal.com/doc/14-1

2020-06-05 11:42

返回的 404 是 jetty 的界面,而不是 jfinal 的 404 界面,证明你的项目未被加载,一般业说原因如下:
1:jetty 未找到 web.xml ,也就不会加载 web.xml 中配置的入口

2:eclipse/IDEA 配置问题,class path 未指向你的编译目标路径,该路径在你的截图中显示是:webapp/WEB-INF/classes

建议下载 jfinal.com 首页右侧的 jfinal_demo_for_maven.zip,采用 maven 组织项目

2020-06-05 00:41

至于你在不同地方输出 PathKit.getWebRootPath() 的值不同的问题,注意是不是时机不同,输出的时机要看是否是在 UndertowKit. doConfigJFinalPathKit(...) 之前还是之后

2020-06-05 00:40

在使用 jfinal undertow 开发时,是通过 jfinal undertow 项目中的 UndertowKit. doConfigJFinalPathKit(...) 方法使用反射的方式,调用了 PathKit.setWebRootPath(...) 方法,向其注入了 undertow.resourcePath 中第一个有效的目录

代码:
https://gitee.com/jfinal/jfinal-undertow/blob/master/src/main/java/com/jfinal/server/undertow/

2020-06-04 20:40

这个描述,看上去是 spring boot 的版本变化造成的,建议你用一下排除法解决一下

对于变化的部分,一项项排除

在 jfinal 层面,jfinal 是没有干预这个结果的

我一般是建议不要使用 tinyint(1) 而是使用 tinyint(2) 等等长度大于 1 的类型,这样的结果更确定,一定会是 int 型

2020-06-04 17:40

话说回来,jfinal 有自己的风格与理念,如果照 spring 的路再走一次的话,jfinal 也就没有存在的价值了

所以,jfinal 的很多理念与 spring 都是完全相反的,例如 jfinal 追求极度轻量级,所以代码量只有 spring 组合框架的几十分之一,甚至几百分之一,任何有 java 基础的同学都可以很容易完全掌控

再例如 jfinal 追求小而精,spring 追求大而全

其实,没有完美的战略,任何好战略的反面也是另一种好的战略。 世界总是这样,连世界上最完美的东西数学都是这样的

2020-06-04 17:36

@老宇 因为 jfinal 的路由方式有很多的优点是 spring 那种模式不具备的

相反的, spring 那种模式还有很多的缺点

这个讨论以前有过很多,已经有比较明确的共识

2020-06-04 16:47

@dql #for 指令小扩号以内的第一个参数, 只是一个临时的变量名,只是一个代号,它的类型完全取决于你当前是对什么类型进行迭代

它的类型不会随着你取不同的名字而改变,例如你取一个 list , 但它仍然不是 List 类型

2020-06-04 16:38

@dql 一定要心中清楚变量的类型,假定你手头的 map 这个变量是 Map 类型

那么循环的时候,每次出来的变量就要取它的 .key 与 .value

你上面的回复中用到了: #for (list : map)

虽然你的迭代变量名为 list,但这个 list 仍然需要 list.key、list.value 来取值

被迭代的对象,不会因为你用了什么变量名而去改变规则,所以我建议对迭代的变量使用 x、y 这种变量名,将上面的

#for ( list : map ) 改成 #for ( x : map ) 以免被名字误导

2020-06-04 16:23

@himans 这个得找个时间好好研究

目前,你可以在项目中进行扩展, CaptchaRender 也可以扩展出 extends MyCaptchaRender来用,然后:
render(new MyCaptchaRender(...))

2020-06-04 16:21

@dql enjoy 的用法与 java 几乎是一样的,并且针对 java 的啰嗦进行了极少量的增强,例如 map 迭代的增强:
#for ( x : map)
#(x.key)
#(x.value)
#end

当然,如果你不想学习,直接使用 java 规则也可以:
#for ( x : map.entrySet() )
#(x.getKey())
#(x.getValue())

#(x.key)
#(x.value)

#end