首页 > 其他分享 >误用HandlerInterceptor引起的BUG(已解决)

误用HandlerInterceptor引起的BUG(已解决)

时间:2023-03-18 19:32:49浏览次数:30  
标签:拦截器 permission 部署 误用 no tips 权限 BUG HandlerInterceptor

一、起因

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

二、经过

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

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

误用HandlerInterceptor引起的BUG(已解决)_SpringBoot

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

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

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个线程。

误用HandlerInterceptor引起的BUG(已解决)_问题定位_02

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

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

  - ThisInterceptor:拦截器

  - InterceptorConfig:拦截器配置

  - InterceptorTestController:访问入口Controller

  - PageController:跳转页面控制器Controller

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

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

误用HandlerInterceptor引起的BUG(已解决)_SpringBoot_03

(2) 方式2 (推荐)

误用HandlerInterceptor引起的BUG(已解决)_SpringBoot_04

三、结果

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

总结:

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

标签:拦截器,permission,部署,误用,no,tips,权限,BUG,HandlerInterceptor
From: https://blog.51cto.com/u_15898747/6129768

相关文章

  • Linux下安装jdk的步骤与bug
    Linux下安装jdk的步骤与bug步骤:先在/opt/下创建一个software文件,用于存放压缩包进入opt下:cd/opt创建software文件:sudovimsoftware在software/下用......
  • Eclipse中debug时String太长怎样查看全部
    场景在Eclispe中进行打断点调试时,取得从接口返回的json数据,转换成String字符串。想取出String的值进行格式化显示,如下:最后直接被省略号代替。实现通过控制台输出命令将其输......
  • AndroidStudio中调试时一直显示waiting for debugger
    场景在AndroidStudio中连接到手机上进行调试时一直提示:WatingForDebugger​​关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现1.查看任务管理器......
  • 【Bug】 Springboot 调用第三方接口报在 "请求目标中找到无效字符。有效字符在RFC 72
    错误信息问题原因tomcat高版本严格按照RFC3986规范解析地址。该规范只允许包含a-zA-Z0-9-_.~以及所有保留字符!*’();:@&=+$,/?#[......
  • IDEA 远程调试 Remote JVM Debug(转)
    https://blog.csdn.net/qq_42277779/article/details/125256915https://refactorfirst.com/how-to-remote-debug-java-application-on-kubernetes......
  • 调试信息gnu_debuglink的使用
    参考:https://rwkbp.makekb.com//?View=entry&EntryID=1470&Msg=objcopy--only-keep-debughellohello.gnu_debuglink.debugobjcopy--strip-allhellohello.gnu_debug......
  • MSSQLSERVER 存储过程debug调试
    每当我们遇到相对稍复杂的业务的时候,都会考虑写在存储过程中,这样相当于一个黑匣,方便管理。 但是如果写的行数太多,如果碰到了问题,凭经验,很难发现问题,那就要用到debug调试......
  • 血泪的线上bug,有关Object.fromEntries
    因为这个线上bug引发的反思:1,兼容性测试的重要性2,代码review的重要性3,技术敏感的重要性还有很多……因为出现线上bug,这个链路上每个人都有责任和需要学习的地方,而作为......
  • Succession 的 bug
    1、Succession先前有个bug,就是会将动画中的所有物件都先添加到屏幕上,再实施动画,目前这个bug已经被修复(但是没有完全修复)2、但是如果 Succession中存在让物件消失的......
  • Jmeter——性能测试的认知以及思考bug(一)
    前言性能测试是一个全栈工程师/架构师必会的技能之一,只有学会性能测试,才能根据得到的测试报告进行分析,找到系统性能的瓶颈所在,而这也是优化架构设计中重要的依据。测试流......