java.lang.IllegalStateException: Cannot create a session after the response has been committed

本文讨论了一个Springboot项目中遇到的问题,包括硬编码的白名单处理、Session异常及性能下降。作者指出,不当的拦截器实现导致了IllegalStateException,并影响用户体验。解决方案是重构拦截器,避免在preHandle中进行繁重的业务处理,并建议选择成熟的框架。强调了代码质量和维护性的重要性。
摘要由CSDN通过智能技术生成

 

如题,这是发生在我们项目中的一个问题。

项目后端框架用的是Springboot单体,框架是从别人手中接过来的,拿到源码之后,我大概看了一下其中的源代码。当时就有很多问题,为什么要实现一个自定义HandlerInterceptor,并且还要做很多业务处理?代码太烂,就不在这里贴出来了,主要干了这么几件事情:

  • token拦截
  • 白名单,是通过一连串的if判断写死在preHandle方法中的
  • 从session中获取用户信息,如果获取不到,就解析token,解析出来之后通过userService查用户信息,查出来放session中,这一步也是放在了preHandle中
  • 之前还有一个操作是在preHandle中,查出用户信息后,解析用户的角色、菜单

下面就说说以上操作会造成什么问题,都是项目发布到服务器上之后,用户使用后实际产生的。

白名单,是通过一连串的if判断写死在preHandle方法中的

这个操作就是硬编码,之后的白名单只能找到自定义的这个拦截器,往里写if。非常不利于维护。

从session中获取用户信息,如果获取不到,就解析token,解析出来之后通过userService查用户信息,查出来放session中,这一步也是放在了preHandle中

其中的代码结构大概是这样的

  User user = (User) request.getSession().getAttribute("user");

  if (user == null) {
     dosth
     request.getSession().setAttribute("userKey", user);
  }

这段代码会直接导致标题中描述的问题:

java.lang.IllegalStateException: Cannot create a session after the response has been committed

产生的原因是创建session在response.getOutputStream()之后。

之前还有一个操作是在preHandle中,查出用户信息后,解析用户的角色、菜单

这个操作和上面解析用户信息的操作会导致应用变得非常慢,慢到令人发指。业务不复杂,说白了就是增删改查,统计数据,用户反馈慢、我自己打开页面也慢。看日志,时不时报标题中的错,追到拦截器中,把那些莫名其妙解析用户信息的代码都移除后,发布服务器,问题都解决了。

做业务系统时,还是得找个经过千锤百炼的框架。如果不幸用了我们用的这种某个人学习搭建的框架,在项目开始,一定要坚持原则,不能使用。如果使用了,已经上线了,一定找准实际,替换。

不过,大原则是,先解决用户问题,再想办法替换。

最后,这一切的基础是自己一定得有积累。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值