「记录」关于 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/**");
而你的目录结构肯定是这样的:
而在访问静态资源的时候,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发。停不下来!
原因就是你设置为重定向后的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;
- 重定向过多,找逻辑错误,看是不是自己的拦截后的重定向被拦截了没有排除。
最后感谢这些博主分享的经验!