读jfinal weixin源码有感,问三个问题。

苏珊大妈 发布于 2016/07/26 16:07
阅读 493
收藏 1

@JFinal @qq596392912 读jfinal weixin源码有感,问三个问题:

1、 ParaMap pm = ParaMap.create("access_token", AccessTokenApi.getAccessTokenStr()).put("openid", openId).put("lang", "zh_CN"); 像这种JQ链式代码有没有一个好听点的名称,其实是用JAVA来模拟的动态语言特性是吧?那有没一个专业点的名称呢。我一直以来都是叫它链式代码。感觉有点LOW。。

2、// 签名检测 if (checkSignature(controller))  这儿是否有必要每交都要去检测一下,会有安全问题吗?最开始配置URL及token的时候不检测了的吗?


3、// 将 ApiConfig 对象与当前线程绑定,以便在后续操作中方便获取该对象:ApiConfigKit.getApiConfig();
ApiConfigKit.setThreadLocalApiConfig(((MsgController)controller).getApiConfig());

在拦截器中我看用户每次请求时都会把apiconfig对象放在本地线程中,如果用户量大了这个内存中的本地线程数量岂不是会很大(当然可以放在redis缓存中),并且同一个用户如果多次请求也会重复的set进去,是否有必要先判断一下呢。还是直接覆盖?


小弟才疏学浅,看了jfinal weixin的源码大半天了,有点小兴奋,提出如上几个问题。希望大神帮我解惑一下。

加载中
1
JFinal
JFinal

    不好意思,回复晚了,这几问题其实提得很好,少有人注意到这些,在此简单做下回答:

1:这个一般叫链式方法调用,由于 setter 都是极度可靠不会抛异常,并且是极度易于理解和致性的代码,做成链式调用,可以将多行代码缩至一行,对可读性有好处,当然,这个不同的人可能有不同的看法,有些人喜欢那种多行调用的方式

2:jfinal weixin 作为一个框架是一定要每次检测的。这个检测是为了防止有人恶意假冒微信平台发消息过来,对系统进行攻击。每次检测可以得知当前信息是否是微信官方平台发送的。

     例如你的项目可能涉及转账汇款的业务,恶意攻击者可以在你服务器链路适当节点处,先开启 http 嗅探工具,然后再真实地去进行转账汇款业务,很容易就得到了交互数据与逻辑规则,然后就可以模拟发送类似的数据包,将你的钱转走。嗅探工具满地都是,极度方便。

    如果你的系统不涉及关键业务,倒是可以做成不每次检测的,不过这也意义不大。因为你可以测试一下那个签名检测方法的性能,应该在每秒百万量级,性能损失可以忽略不计。

3:不要只看到这行代码:ApiConfigKit.setThreadLocalApiConfig(((MsgController)controller).getApiConfig());,后面的 :

finally {
  ApiConfigKit.removeThreadLocalApiConfig();
}

    会确保 threadlocal 中的资源被释放, finally 块不会去理会 try 中发生的异常,始终会被调用。

     至于内存占用过大根本不存在,因为这个本质就是放个指针进去,每个线程应该在 32 至 64 字节之内,系统同时并发的数量如果是 10 万人,也就几十兆的空间占用。

     多个用户多次使用 set 进去,要考虑不同的请求,可能是不同的公众号,那么所对应的 ApiConfig 就不同,jfinal weixin 支持多公众号处于同一 jvm 内。即便不支持多公众号,对于每个用户建立与 ApiConfig 的对应关系更多是业务层面的事情,站在jfinal weixin 的角度目前的处理方式更加方便简单。

苏珊大妈
苏珊大妈
感谢
返回顶部
顶部