这个防火墙有个坑啊 啊 啊。。。。。
事情原由:项目初次引入security为swagger相关页面做验证
异常:org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.
解决:
解决方法:(注意方法下方趟过的撸)
1.强制自定义防火墙
@Bean
public HttpFirewall defaultHttpFirewall() {
return new DefaultHttpFirewall();
}
@Override
public void configure(WebSecurity web) throws Exception {
//新防火墙强制覆盖原来的
web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
//super.configure(web);
}
2.修改swagger源码,修复//
的bug
3.网上查到的方法(我自己测试无法使用这种方法)
@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
StrictHttpFirewall firewall = new StrictHttpFirewall();
//此处开启不让检测‘/’符号
firewall.setAllowUrlEncodedSlash(true);
return firewall;
}
@Override
public void configure(WebSecurity web) throws Exception {
web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
//super.configure(web);
}
趟过的路:
方法一:使用方法已通过的确实可以避开“//”,但是跟过源码
改源码使用的uri是String类型,这个if即使含“//”也会返回false(即有效的url),感觉这个方法没啥用
方法二:正常没毛病,可用、
使用该方法,途中校验1可以通过,但是校验2中isNormalized(request)的检验"//"是写死的啊
ε=(´ο`*)))唉,最靠谱的方法二需要体力ε=ε=ε=(#>д<)ノ
各位路过的,如果有指正请及时赐教,挽救我于无尽苦海