2020-06-04 16:11

@zsw大伟 的确,需要一键把从分享移动到反馈的功能。抽空做一个 :P

2020-06-04 16:09

@JFinal
后续跟进

1、setCookie("myCookie", "myValue; saveSite=...");这种方式似乎无效
doLogin代码改成:
setCookie(LoginService.sessionIdName, sessionId + "; sameSite=lax", maxAgeInSeconds, true);
这会导致cookie响应中value多一个引号,同时samesite还是none。

原来,原始头里面的set-cookie是这样的:
jfinalid="d5e7b94296534ef8aad6d16dd2b9cb08 ; sameSite=Lax"; Version=1; Path=/; HttpOnly; Max-Age=604800; Expires=Thu, 11-Jun-2020 07:49:28 GMT

2、没事,继续糊弄浏览器,中间插入双引号分别闭合试试:
setCookie(LoginService.COOKIE_SESSION_NAME, sessionId + "\"; sameSite=\"lax", maxAgeInSeconds, true);

header里面竟然没有转义
Set-Cookie: jfinalid="0c7988af91e04c6fb2d2d6190551591a\" ; sameSite=\"Lax"; Version=1; Path=/; HttpOnly; Max-Age=604800; Expires=Thu, 11-Jun-2020 07:53:56 GMT

3、接着来
setCookie(LoginService.COOKIE_SESSION_NAME, sessionId + "' ; sameSite='Lax", maxAgeInSeconds, true);

Set-Cookie: jfinalid="50798adf661c43648b8090737adc51c9\" ; sameSite=\"Lax"; Version=1; Path=/; HttpOnly; Max-Age=604800; Expires=Thu, 11-Jun-2020 07:58:50 GMT

4、不折腾了,还是自建Cookie,setSecure(true)完事。

5、Login可以手工修改,Jfinal的CaptchaRender里面依然有这个问题。

2020-06-01 12:20

@JFinal 是后者,原有cookie上的新属性
哈哈~没想到还可以这样解决~巧妙!...header毕竟文本...

2020-05-28 21:27

@JFinal 补充一下:Undertow的Cookie里面是有sameSite属性的

2020-05-27 20:24

@JFinal
测试:针对LoginController里面的doLogin()方法中的setCookie代码:
setCookie(LoginService.sessionIdName, sessionId, maxAgeInSeconds, true);

注:LoginService.sessionIdName = "jfinalId"

经过测试,无法通过简单调用controller里面的setCookie来设置sameSite属性,这个方法其实是添加了一个新的cookie,其key="sameSite",而不是给key="jfinalId"的这个cookie设置属性。
正确的做法应该是new 一个Cookie cookie,再给cookie设置sameSite,可惜的是,Jfinal中引入的Cookie为javax.servlet.http.Cookie,这个类里面不存在sameSite属性。

研究了文档,采用了2重解决方案。
1、尝试创建了一个BaseCookie继承自Cookie,给BaseCookie增加sameSite属性,然后给新的BaseCookie baseCookie设置setSameSite("Lax"),然后调用response的addCookie(baseCookie)。
结果是,sameSite属性并未加入到响应头的cookie中,研究了代码,发现原因是addCookie方法是安全克隆,过滤掉了没有的属性。
方法1失败。
2、退而求其次,简单一点直接设置secure属性为真。
cookie.setSecure(true),然后addCookie,控制台的这个提示就消失了。
感觉这个方法并不是很安全。
===============
简单结论:
1、可能目前引入的servlet的版本还不支持sameSite,Cookie是否有、或需要新版本,尚未深入研究;
2、Jfinal核心组件CaptchaRender里面直接set了_jfinal_captcha这个cookie,这段代码要从Jfinal层面进行修改,这次没有尝试;
3、在LoginController里面的doLogin()方法中,对Cookie进行setSecure操作可去掉控制台报警,我暂时采用这个方式解决。只是临时解决。
4、上文提到的方法1,可能从Jfinal层面会有比较好的解决。

2020-05-27 17:31

好的,我就用setCookie("SameSite", "Lax");解决

2020-03-27 10:44

@JFinal 了解,谢谢~

2020-03-26 16:50

@JFinal 如果是方案1,那么5应该是够了,毕竟还可以指定。

2020-03-26 09:29

@JFinal 非常感谢!
这两个方案,从实用性上来说,可能第一个好一点。因为一般来说,应用中Decimal类型多用于金额和数量,而金额的情况下,大多是是2位数,如果要计算价格(或比率),那么可能还是会产生位数不够的问题。如果采用这个方案,那么最好RoundingMode也可以指定,因为国内主要使用“四舍五入”HALF_UP。
从灵活性上来说,第二个好一些,但是必须先给一个除数或被除数在后台指定scale(需要较多位数的情况下,这样在select一个集合的情况下可能比较麻烦),这个虽然不够简洁,但也似乎没有更简洁的办法。或者取left和right的scale的和?
当然二个方案都支持是更好的。
另外作为Enjoy模板,有“安全取值”的思想,蛮好的,是否有必要在除法里面也反映进去,比如,当除数为0时肯定异常,安全取值时,除数为0则渲染成空字符或0,避免每次都要判断(当然要判断也是很容易的事情:#(b==0?0:a/b)。

2020-03-25 13:46

@JFinal 谢谢!只要搞清楚核心问题就好。不寻求修改Enjoy规则。反馈只是希望对你以后升级有用。
用的是MySQL,DB中数据类型是decimal(9,2),SQL语句是用的聚合函数sum()得到Record。
15日反馈之后就采用了先在后台计算出4位小数再传到前台的方法,跟你建议的一样。

2020-03-25 11:05

@JFinal 的确,Arith中是用BigDecimal来计算的,与之前你我猜想的一致。
因为回复里不支持超文本,调试结果已经修改在反馈正文里面了,请看正文《2020-3-25 测试结果反馈》

2020-03-25 09:57

@JFinal 非常感谢详细回复。测试数据类型这正是我想要的。会继续汇报结果。

2020-03-24 17:38

@JFinal 其实一开始的表达式就是number表达式:#(sum.expense / sum.budget, "0.00%"),得出1.00%,所以才测试直接用 #() 输出的。