atjiu / pybbs

更实用的Java开发的社区(论坛),Better use of Java development community (forum)
GNU Affero General Public License v3.0
1.87k stars 711 forks source link

bug提交 #128

Closed TRLVMMR closed 4 years ago

TRLVMMR commented 4 years ago

先声明,由于本人使用的是同学下载的master分支,没有下载稳定版本,因此有些功能可能作者还在开发,也可能bug已经在新的提交中解决。因此下面的bug仅供参考。

本人由于课程需求,下载了此系统进行系统二次开发,下面细数遇到的一些bug。

1 验证码无法验证问题,session无效

(此问题作者可以无视,并不是作者的错),由于作者使用session进行验证码验证。但由于我此前在本域名下是https的服务器,因此导致,chrome浏览器给出以下警告 image 其他表单字段全部有效,唯独这个,chrome不提交的话,每次的session都是同一个session,自然无法登陆。本人尝试修改cookie作用域后仍然无效,查到的原因貌似是是chrome认识JSESSIONID这个前缀,如果这个值不是在https上就不提交。 解决方法:更改tomcat的sessionid前缀,

server:
  servlet:
    session:
      cookie:
        secure: false
        http-only: false
        name: sessionid

2 AOP没有生效问题

如下图,由于作者的点赞中,使用的是this.update。总所周知,AOP无法拦截内部调用,导致这次调用无法被拦截,如果一定要,需要先获取代理。类似的还有几处,就不一一指出。 image

image

3 Redis获取时的BUG

我觉得作者有一个厉害的地方,就是把redis写成插件,无侵入,可随时移除。不过,这里也有一个bug。由于作者在使用redis时,基本都是以下操作

JedisPool instance = this.instance();
if (instance == null) return null;
jedis = instance.getResource();

虽然作者每次都判断实例是否为空,但是有可能实例不为空,但在执行getResource方法时却出现redis异常。出现异常会发生什么?那就是,一些AOP中,有使用redis的,全部无法正常工作!因此每次都在执行service逻辑之前就遇到redis异常,因此每次返回值都为空,页面无法正常显示。

重现场景:在管理页面配置一个地址无效的redis。或者直接把系统的redis关掉。

4 其他

忘了。。。如果有空,下次找找再补上。另外吐槽下作者的数据库设计,比如点赞表,居然第一范式都不遵守,一个字段保存多个值,不过好处也很明显,容易直接读到缓存。。本人点赞喜欢用redis持久化,是写了mybatis插件,然后把点赞表移到redis中,然后把此字段删除。。。不过这样的话,感觉我在暴殄作者的redis插件。。

atjiu commented 4 years ago

感谢反馈

  1. continue;
  2. 这问题我去年发现了,当时解决办法是把那些不好处理的方法从代理中去掉,刚又看了一下代码,vote() 方法没有走代理
  3. 既然想用redis,那就找一个没问题的redis服务器呀,我刚也试了一下,配置一个不存在的redis服务,再访问页面确实会出现这问题,我不觉得这是程序的bug,就跟启动项目的时候,因为mysql的用户名密码不对导致数据库连接失败一样
  4. pybbs里没有点赞表,我是一个话题的点赞用户的id都放在了一个字段里维护了,首先这样省事,其次也能减少对数据库的操作,不过这里确实有个问题,就是用户量上来后,如果一个帖子的点赞用户非常多的话,这就是个累赘了,而且我为了防止过长,upIds用的是 text 类型,理论上确实应该放在另外表中维护