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

前言

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 版本配置拦截器方法 + 解决拦截静态资源 + 解决重定向_第1张图片
而在访问静态资源的时候,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 版本配置拦截器方法 + 解决拦截静态资源 + 解决重定向_第2张图片
原因就是你设置为重定向后的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 映射的地址。
在这里插入图片描述
对于没有设置 server.servlet.context-path 的情况,我测试后发现也是相同的办法。

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

小结

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

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

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

你可能感兴趣的:(踩坑)