Spring Boot ,Spring Security的Filter在Tomcat正常,部署在Weblogic 12c Filter顺序出错,导致拦截权限问题
2017-11-27 23:21
1471 查看
Spring Boot使用main函数启动或在tomcat中启动时,Filter是按照正常的顺序执行拦截,将工程打包为war包,部署到weblogic上时,Filter执行顺序错乱,导致权限拦截出错。
最近公司的一个项目使用Spring Boot开发,前期也做了技术评估,打包成war到Tomcat和Weblogic 12c上运行,静态资源和RequestMapping访问均正常,以为万事大吉,就开干了,由于Spring Boot提供了main方式启动,开发效率确实提高不少,所以团队都使用这种方式开发,最近项目做的差不多了,要求测试,将工程打包为war包,部署到weblogic上,问题来了,授权的url始终被一个拦截器优先拦截导致授权通不过,将war包放到Tomcat中,运行正常,百思不得其解。
抓捕问题步骤:
将出问题的Filter(我这里为MyFilterSecurityInterceptor)不addFilter到Spring Security的HttpSecurity中,打包部署到weblogic上,问题依旧,查看log日志,还是进入到MyFilterSecurityInterceptor,oh my god.
于是将 @EnableWebSecurity(debug=true) debug打开,发现打印的Log 的 Security filter chain: [] 确实没有MyFilterSecurityInterceptor,可是为啥还是进入到此MyFilterSecurityInterceptor,当时也没多想,以为weblogic的bug,上百度,google 查看了下,说需要重写SpringBootServletInitializer的onStartup(ServletContext
servletContext) ,查看了 SpringBootServletInitializer的方法,也不知道从何写起,于是在源码中打断点追踪代码,发现只要是 实现了 Filter的类 ,并且 @Component 注解的,都进入 org.springframework.boot.web.servlet.AbstractFilterRegistrationBean.onStartup(ServletContext) 方法,被 FilterRegistration.Dynamic added = servletContext.addFilter(name,
filter); addFilter添加到 servletContext中,难道系统对Filter的Bean默认注册么,经过搜索,果然是默认Filter自动注册,spring
boot官方文档说明默认情况下对
and
@Bean,@Component 这些只要是implements Filter的类,自动添加,默认的过滤路径为 /* 。
更改方式,
去掉 @Component
通过new 方式,即可解决此问题。
其他解决方式:Spring
Boot对Servlet,Filter提供了相应的注册类,可以使用 FilterRegistrationBean 来讲进行Filter的精细化配置:
官方给出示例:
看来真是得好好看官方文档啊,不了解Spring Boot,还真是很容易入坑。
将此问题记下,以免再次犯错误。
参考资料:
Spring
Boot Document
Spring Boot: 取消Filter自动注册
最近公司的一个项目使用Spring Boot开发,前期也做了技术评估,打包成war到Tomcat和Weblogic 12c上运行,静态资源和RequestMapping访问均正常,以为万事大吉,就开干了,由于Spring Boot提供了main方式启动,开发效率确实提高不少,所以团队都使用这种方式开发,最近项目做的差不多了,要求测试,将工程打包为war包,部署到weblogic上,问题来了,授权的url始终被一个拦截器优先拦截导致授权通不过,将war包放到Tomcat中,运行正常,百思不得其解。
抓捕问题步骤:
将出问题的Filter(我这里为MyFilterSecurityInterceptor)不addFilter到Spring Security的HttpSecurity中,打包部署到weblogic上,问题依旧,查看log日志,还是进入到MyFilterSecurityInterceptor,oh my god.
于是将 @EnableWebSecurity(debug=true) debug打开,发现打印的Log 的 Security filter chain: [] 确实没有MyFilterSecurityInterceptor,可是为啥还是进入到此MyFilterSecurityInterceptor,当时也没多想,以为weblogic的bug,上百度,google 查看了下,说需要重写SpringBootServletInitializer的onStartup(ServletContext
servletContext) ,查看了 SpringBootServletInitializer的方法,也不知道从何写起,于是在源码中打断点追踪代码,发现只要是 实现了 Filter的类 ,并且 @Component 注解的,都进入 org.springframework.boot.web.servlet.AbstractFilterRegistrationBean.onStartup(ServletContext) 方法,被 FilterRegistration.Dynamic added = servletContext.addFilter(name,
filter); addFilter添加到 servletContext中,难道系统对Filter的Bean默认注册么,经过搜索,果然是默认Filter自动注册,spring
boot官方文档说明默认情况下对
@WebServlet,
@WebFilter,
and
@WebListener以及
@Bean,@Component 这些只要是implements Filter的类,自动添加,默认的过滤路径为 /* 。
更改方式,
去掉 @Component
MyFilterSecurityInterceptor myFilterSecurityInterceptor = new MyFilterSecurityInterceptor(); myFilterSecurityInterceptor.setAccessDecisionManager(myAccessDecisionManager); myFilterSecurityInterceptor.setSecurityMetadataSource(securityMetadataSourceService); httpSecurity //添加JWT filter .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) //添加 拦截权限 filter .addFilterBefore(myFilterSecurityInterceptor, FilterSecurityInterceptor.class);
通过new 方式,即可解决此问题。
其他解决方式:Spring
Boot对Servlet,Filter提供了相应的注册类,可以使用 FilterRegistrationBean 来讲进行Filter的精细化配置:
官方给出示例:
@Bean public FilterRegistrationBean registration(MyFilter filter) { FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.setEnabled(false); return registration; }
看来真是得好好看官方文档啊,不了解Spring Boot,还真是很容易入坑。
将此问题记下,以免再次犯错误。
参考资料:
Spring
Boot Document
Spring Boot: 取消Filter自动注册
相关文章推荐
- tomcat 下虚拟机部署导致应用filter失效的问题
- Tomcat权限问题,导致每次访问页面第一次正常,第二次报错404
- ajax在tomcat 上正常,部署到weblogic上就出现问题了,提示下载action路径
- Tomcat上运行正常,部署在weblogic服务器上,不认jsp等标签问题
- 今天更新代码之后,突然出现一个问题:Tomcat启动时,总是会出现jvm fatal error错误导致tomcat无法正常启动,以下是错误信息:
- struts2 Tomcat部署 权限问题
- 工程部署tomcat正常运行迁移至weblogic报出异常Could not load user defined filter
- tomcat下同时部署两个项目不能正常启动的问题
- 关于spring mvc拦截器拦截js文件等导致无法正常使用问题的解决
- MacOS下解决Tomcat 不正常关闭导致端口被占用的问题
- Tomcat上Web app部署出错问题Mark
- linux 中JDK环境变量不一致问题导致mysql无法连接,总是告诉权限出错
- Web项目在tomcat运行正常,移至weblogic后页面报错的问题
- axis部署到weblogic因为运行环境为jrockit导致空指针的问题
- 中文乱码问题,Eclipse能正常显示,但在tomcat部署工程中不行
- ShiroFilterFactoryBean 处理拦截资源文件问题)(Shiro权限管理)
- 关于避免部署在eclipse和tomcat下的项目下保存的图片随着下次重新部署导致图片文件夹被清除的问题
- 关于避免部署在eclipse和tomcat下的项目下保存的图片随着下次重新部署导致图片文件夹被清除的问题
- tomcat部署多个项目引发Filter无效的问题
- 关于tomcat服务器部署,页面报404/500错误,myeclipse异常关闭 导致tomcat 6.0 无法重启 的问题