欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

「记录」关于 SpringBoot 版本配置拦截器方法 + 解决拦截静态资源 + 解决重定向

程序员文章站 2024-03-25 08:57:40
...

前言

SpringBoot 2.X 版本中添加拦截器大概会遇到这么几个问题:1.怎么配置?2.怎么配置了不起作用?3.配置完我的静态资源哪去了?4.网页提示重定向次数过多。自己也是都遇到了,为了解决这些问题,也看了一些博文。这些博文各有侧重吧,反正是把这些个问题都解决了。这里做个记录,如果有缘看到了,希望能对你有所帮助。
对了,这里的情景是做后台管理的登录拦截。其它的不多说了,开始整理。

配置

使用 HandlerInterceptor 来做 preHandle,详情参见:官方文档
这里的逻辑就是,如果 session 中没有登录信息,那么就重定向至登录页面。

@Component
@Slf4j
public class AdminInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Object admin = request.getSession().getAttribute("admin");
        if(admin != null) {
            return true;
        } else {
            log.warn("未登录请求!");
            response.sendRedirect("/booksys/back/adminlogin");
            return false;
        }
    }

}

配置方式

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    /**
     * 配置 Admin 的拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AdminInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/back/adminlogin")
                .excludePathPatterns("/back/adminLoginIn")
                .excludePathPatterns("/assets/**")
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/fonts/**")
                .excludePathPatterns("/images/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/vendor/**");
    }
}

配置方式都大同小异了,addPathPatterns就是添加拦截的路径,可见拦截的方式很暴力,直接/**全部拦截。

静态资源被拦截问题

大家都是这么说的,在addInterceptors方法中采用如下配置:

.excludePathPatterns("/static/**");

而你的目录结构肯定是这样的:
「记录」关于 SpringBoot 版本配置拦截器方法 + 解决拦截静态资源 + 解决重定向
而在访问静态资源的时候,url请求static中的文件夹是不会通过/static请求的。而是通过/js或者/images这样去请求。所以在addInterceptors方法中,改成如下的方式(这里的代码就是配置那里的第二部分代码,因侧重点改变注释有所不同)
这一点的来源:CSDN博主:weixin_40632733

@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    /**
     * 配置 Admin 的拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AdminInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/back/adminlogin")
                .excludePathPatterns("/back/adminLoginIn")
                // 将static目录下的文件名逐个排除
                .excludePathPatterns("/assets/**")
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/fonts/**")
                .excludePathPatterns("/images/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/vendor/**");
    }
}

重定向次数过多

这个问题的原因,其实打个断点很容易看出来。
你就点击 Resume Program吧,你会发现,
后台一直在往你重定向的URL发。停不下来!
「记录」关于 SpringBoot 版本配置拦截器方法 + 解决拦截静态资源 + 解决重定向
原因就是你设置为重定向后的URL被拦截,然后不停地进入、拦截、进入、拦截。所以,你一定要放行你重定向后的URL。禁止套娃!

    /**
     * 配置 Admin 的拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AdminInterceptor())
				// 对应后台 controller 层的请求
                .excludePathPatterns("/back/adminlogin")
                .excludePathPatterns("/back/adminLoginIn")
    }
}

此处的来源:CSDN博主:185的阿平

如果你写了,但还是重定向次数过多。那么问题在于,你写的的 URL 错了这就引出来究极问题,配置了不起作用。

配置了不起作用

已经解决了静态资源的问题,这里把目光就放在匹配controller上。
我主要是因为自己配置了server.servlet.context-path为/booksys,没有搞清楚在排除时需不需要写上这个路径。最后根据博主:沐羽轩的方法,调试成功了。
简单总结如下:

如果你在配置文件中设置了 server.servlet.context-path,那么也不要理它,直接写 controller 映射的地址。
「记录」关于 SpringBoot 版本配置拦截器方法 + 解决拦截静态资源 + 解决重定向
对于没有设置 server.servlet.context-path 的情况,我测试后发现也是相同的办法。

所以总结一下,这里就是不要理会context-path,在excludePathPatterns中直接映射 controller

小结

整篇其实都是围绕addInterceptors方法在做文章。小结如下:

  • 静态资源,排除 static目录下的文件路径;
  • 请求,直接映射 controller;
  • 重定向过多,找逻辑错误,看是不是自己的拦截后的重定向被拦截了没有排除。

最后感谢这些博主分享的经验!

相关标签: 踩坑