如题,这是发生在我们项目中的一个问题。
项目后端框架用的是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中,查出用户信息后,解析用户的角色、菜单
这个操作和上面解析用户信息的操作会导致应用变得非常慢,慢到令人发指。业务不复杂,说白了就是增删改查,统计数据,用户反馈慢、我自己打开页面也慢。看日志,时不时报标题中的错,追到拦截器中,把那些莫名其妙解析用户信息的代码都移除后,发布服务器,问题都解决了。
做业务系统时,还是得找个经过千锤百炼的框架。如果不幸用了我们用的这种某个人学习搭建的框架,在项目开始,一定要坚持原则,不能使用。如果使用了,已经上线了,一定找准实际,替换。
不过,大原则是,先解决用户问题,再想办法替换。
最后,这一切的基础是自己一定得有积累。