如何避免因误用HandlerInterceptor导致的BUG(已修复)?

2026-05-20 23:232阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计942个文字,预计阅读时间需要4分钟。

如何避免因误用HandlerInterceptor导致的BUG(已修复)?

点击解锁更多优质文章。

一、起因今天早上,领导安排了一个部署的项目,这是之前同事做的项目,而我只需要将项目打包、部署请求成功即可!这对我来说是个简单的任务。

点击​​Mr.绵羊的知识星球​​解锁更多优质文章。

如何避免因误用HandlerInterceptor导致的BUG(已修复)?

一、起因

今天早上,领导安排一个部署的项目,这是很早之前其他同事做的项目,而我只需要将项目打包、部署请求成功就OK!这对我来说没难度啊!开整!

二、经过

首先,了解了下项目简介和流程。当然之前保留的部署文档不是很全(写文档很重要),直接docker+k8s命令部署。不出意外的话就出意外了。这里就是部署不成功,原因是之前是图形化界面部署,并且k8s的yaml格式需要调整和配置的修改(统一管理配置文件版本很重要)。但这不是本文的重点。略过...

1. 重点在这:部署完成!登录事先提供的测试用户,开始请求页面。

这 不对!我只请求了一次,怎么重定向次数过多?那就开始定位吧!

定位问题前,需要先搞清问题的本质和流程,对于刚刚请求的流程......->过滤器->拦截器->......发现拦截器好像不太对啊!咱看看下面代码有什么问题(为了方便看我就简写一下):

public class ThisInterceptor implements HandlerInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(ThisInterceptor.class); @Override public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { // 获取当前用户权限集合 List<String> permissions = listPermission(); if (CollectionUtils.isEmpty(permissions)) { // 如果当前用户无权限, 跳转无权限提示页面 try { // 重定向到no-permission-tips页面 response.sendRedirect("no-permission-tips"); } catch (IOException e) { LOGGER.error("redirect page exception: ", e); } return false; } return true; }

看不懂的可以看看(拦截器流程详解这篇文章ps:我还没写,写完在看也行)。

2. 问题就出在:

(1) 提供给我一个没有权限的用户(这是前提条件,不是问题)。

(2) if这个判断有问题:

response.sendRedirect("no-permission-tips")后return false。也就是由于权限列表为空,被拦截器拦截。但是由于拦截前重定向到no-permission-tips页面,又会进入拦截器,权限列表为空,被拦截器拦截。......这样就一直循环在这,出不去了。就像下面这张图,我请求了一次,但是搞了n个线程。

3. 如何解决这个问题呢?

代码:git地址(稍后同步),下面是代码结构

- ThisInterceptor:拦截器

- InterceptorConfig:拦截器配置

- InterceptorTestController:访问入口Controller

- PageController:跳转页面控制器Controller

(1) 方式1 (可以解决但是不优雅)

新增判断如果uri包含no-permission-tips,直接放行,不走下面的逻辑。

(2) 方式2 (推荐)

三、结果

按照方式2修改终于可以成功跳转了。部署完成后测了一下,没啥问题。

总结:

总的来说不管是使用拦截器还是过滤器,一定要了解他,否则就会写bug。针对上面的案例或许还有其他更优雅的解决方案,欢迎评论留言。

标签:bug

本文共计942个文字,预计阅读时间需要4分钟。

如何避免因误用HandlerInterceptor导致的BUG(已修复)?

点击解锁更多优质文章。

一、起因今天早上,领导安排了一个部署的项目,这是之前同事做的项目,而我只需要将项目打包、部署请求成功即可!这对我来说是个简单的任务。

点击​​Mr.绵羊的知识星球​​解锁更多优质文章。

如何避免因误用HandlerInterceptor导致的BUG(已修复)?

一、起因

今天早上,领导安排一个部署的项目,这是很早之前其他同事做的项目,而我只需要将项目打包、部署请求成功就OK!这对我来说没难度啊!开整!

二、经过

首先,了解了下项目简介和流程。当然之前保留的部署文档不是很全(写文档很重要),直接docker+k8s命令部署。不出意外的话就出意外了。这里就是部署不成功,原因是之前是图形化界面部署,并且k8s的yaml格式需要调整和配置的修改(统一管理配置文件版本很重要)。但这不是本文的重点。略过...

1. 重点在这:部署完成!登录事先提供的测试用户,开始请求页面。

这 不对!我只请求了一次,怎么重定向次数过多?那就开始定位吧!

定位问题前,需要先搞清问题的本质和流程,对于刚刚请求的流程......->过滤器->拦截器->......发现拦截器好像不太对啊!咱看看下面代码有什么问题(为了方便看我就简写一下):

public class ThisInterceptor implements HandlerInterceptor { private static final Logger LOGGER = LoggerFactory.getLogger(ThisInterceptor.class); @Override public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { // 获取当前用户权限集合 List<String> permissions = listPermission(); if (CollectionUtils.isEmpty(permissions)) { // 如果当前用户无权限, 跳转无权限提示页面 try { // 重定向到no-permission-tips页面 response.sendRedirect("no-permission-tips"); } catch (IOException e) { LOGGER.error("redirect page exception: ", e); } return false; } return true; }

看不懂的可以看看(拦截器流程详解这篇文章ps:我还没写,写完在看也行)。

2. 问题就出在:

(1) 提供给我一个没有权限的用户(这是前提条件,不是问题)。

(2) if这个判断有问题:

response.sendRedirect("no-permission-tips")后return false。也就是由于权限列表为空,被拦截器拦截。但是由于拦截前重定向到no-permission-tips页面,又会进入拦截器,权限列表为空,被拦截器拦截。......这样就一直循环在这,出不去了。就像下面这张图,我请求了一次,但是搞了n个线程。

3. 如何解决这个问题呢?

代码:git地址(稍后同步),下面是代码结构

- ThisInterceptor:拦截器

- InterceptorConfig:拦截器配置

- InterceptorTestController:访问入口Controller

- PageController:跳转页面控制器Controller

(1) 方式1 (可以解决但是不优雅)

新增判断如果uri包含no-permission-tips,直接放行,不走下面的逻辑。

(2) 方式2 (推荐)

三、结果

按照方式2修改终于可以成功跳转了。部署完成后测了一下,没啥问题。

总结:

总的来说不管是使用拦截器还是过滤器,一定要了解他,否则就会写bug。针对上面的案例或许还有其他更优雅的解决方案,欢迎评论留言。

标签:bug