之前的设备校验是在所有的页面跳转Controller中加入重复的判断,即使把判断的方法抽取出来了,但还是有大量重复的代码。但是在之前的需求中,我还是这么做了。
这次我为什么要改呢,是因为现在的登录接口不仅要给pc用还要给app用,他俩的登录功能类似,但登录之后各自都有个设备校验,pc端是校验登录的设备是否是第一次登录,而app端校验的是用户的账号是否是第一次登录,虽然可以大改所有的controller,但我并不想这么做,太不优雅了。
所以我就去深入了解了一下Spring Security的过滤链
每个请求都会执行一遍springsecurity 过滤链中的所有过滤器,所以我写个过滤器加入到过滤链中,并且利用 addFilterAfter 加入到 UsernamePasswordAuthenticationFilter 之后,拦截所有的请求
当我做了之后首先遇到了第一个问题,静态资源不加载,报错的原因是因为多次commit了response,
因为每次访问都会走一遍这个过滤链,而我自定义的过滤器,并不完善,所以每个请求都会来commit我的response,百度了一番之后,大家都说放行在配置类中放行静态资源即可
原本我是配置了
http.authorizeRequests()
.antMatchers(securityProperty.getOpenApi()).permitAll()
但是我的静态资源还是走了过滤链
后来又配置了
web.ignoring().antMatchers("/admin/**","/component/**","/favicon.ico");
这次页面显示正常了,晚上阅读springsecurity的相关文档得知,放图
但是后来又遇到了问题,我故意跳转一个404页面,404页面的图片又不加载了,这次又说我重复提交了response的commit
我先是怀疑又是静态文件走了过滤链,又跟老师一起阅读了源码发现,让忽略静态文件生效的的类叫做
FilterSecurityInterceptor
发现他的执行顺序在我的过滤器之前,我就想一定是因为这个类还没有走我的请求就发送了,所以导致没有忽略静态资源,我就利用
.addFilterAfter(verifySecureSupport, FilterSecurityInterceptor.class)
调整过滤链的顺序
还是不行。
一夜过去了
我睡前一直在想该怎么办
早上去工作室的时候突然想起来一个好办法,
利用
request.getServletPath()
获取请求的路径,如果是静态资源肯定会是.png,.js等等等等
反正都会有个点,并且接口是都没有点的
所以我就直接
if(request.getServletPath().indexOf(".")==-1)
运行起来,非常完美
问题都解决了