SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】

前言

最近LZ给项目框架升级, 从Spring1.x升级到Spring2.x, 在这里就不多赘述两个版本之间的区别以及升级的原因。

关于升级过程中踩的坑,在其他博文中会做比较详细的记录,以便给读者参考,不要掉进同样的坑里。 这里我们讨论一个关于URL中包含双斜杠被拦截的问题。

发现问题

升级框架之后,测试一个功能时,发现报错Http 500, 第一时间怀疑是后台功能报错。打印后台错误日志,发现报错信息:The request was rejected because the URL was not normalized。

之后与升级前相同环境对比发现,相同的功能, 升级之后,URL中包含双斜杠。

分析问题

经过对比不同和错误信息,初步定位问题出在URL上。查询资料得知,Spring Security 在高版本中增加了StrictHttpFirewall类,对URL校验更加严格。于是查看源码:

<code>
1private static boolean isNormalized(String path) { 2 if (path == null) { 3 return true; 4 } else if (path.indexOf("//") > -1) { 5 return false; 6 } else { 7 int i; 8 for(int j = path.length(); j > 0; j = i) { 9 i = path.lastIndexOf(47, j - 1); 10 int gap = j - i; 11 if (gap == 2 && path.charAt(i + 1) == '.') { 12 return false; 13 } 14 15 if (gap == 3 && path.charAt(i + 1) == '.' && path.charAt(i + 2) == '.') { 16 return false; 17 } 18 } 19 20 return true; 21 } 22}
</code>

解决问题

方法一:修改项目中出现“//”双斜杠的URL路径,哈哈

方法二:自定义FireWall方式允许URL出现双斜杠“//”

参考:Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized

https://stackoverflow.com/questions/48453980/spring-5-0-3-requestrejectedexception-the-request-was-rejected-because-the-url/49116274

  1. 创建允许在URL中使用斜线的自定义防火墙。

    @Bean public HttpFirewall allowUrlEncodedSlashHttpFirewall() { StrictHttpFirewall firewall = new StrictHttpFirewall(); firewall.setAllowUrlEncodedSlash(true);
    return firewall; }

2.在WebSecurity中配置这个bean。

1@Override 2public void configure(WebSecurity web) throws Exception { 3 //@formatter:off 4 super.configure(web); 5 web.httpFirewall(allowUrlEncodedSlashHttpFirewall()); 6.... 7}

至此,问题解决。

点赞
收藏

评论区

加载中...

相关推荐

jdk 1.6升级至1.8

最近把一个老项目进行了jdk的升级记录了ApacheTomcat/7.0.56不支持jdk1.87.0.72之后是jdk1.7写的就支持jdk1.8了。还有些其他的问题与解决方法FtpClientjdk1.7与jdk1.6区别\_qq\_25763843的博客CSDN博客\_ftpclientjdk1.7和1.6改动(htt

Spring Cloud 微服务开发指南

如同SpringBoot在JavaWeb开发领域中的统治地位,SpringCloud在Java微服务应用开发领域中同样处于垄断地位。软件系统从单体升级到微服务架构,随之会出现各种分布式系统所特有的问题,包括服务注册发现、认证授权、限流熔断、调用追踪等。SpringCloud提供了各种组件来解决这些问题,本文将通过升级改造一个单体AP

PHP连接MySQL 8.0报错的解决办法

MySQL升级到8.0之后,PHP连接报错怎么解决?作为资深的MySQL票友,最近我总在给8.0吹水,我们知数堂的MySQL课程去年也早就升级到8.0版本了。我的VPS老早就想升级了,无奈PHP版本太低,担心升级后有问题,所以一直没去折腾。这两天稍微得空,就开始折腾升级MySQL版本。为了解锁最香新功能,我直接升级到了最新的MySQL8.0.1

Service starting has been prevented by iaware or trustsbase sInfo ServiceInfo 解决方法

问题:ActivityManager:ServicestartinghasbeenpreventedbyiawareortrustsbasesInfoServiceInfo{c50ea35xxx.xxx.xxx.ServiceName}问题描述,该问题再华为部分手机升级到Android10.1之后,启动服务会

Druid时序数据库升级流程

目前Druid集群版本为0.11.0,新版本0.12.1已支持DruidSQL和Redis,考虑到Druid新特性以及性能的提升,因此需要将Druid从0.11.0版本升级到0.12.1版本,下面将对Druid升级步骤做详细的介绍,升级时请严格按照此步骤进行升级,以免出现一些不可预知的问题。1\.Druid升级包Dru

Dubbo版本升级

一、背景早期内部使用的是当当网fork的Dubbox,由于现在Dubbo又开始重新维护,而且阿里将其捐献给了Apache,并成为了Apache的顶级项目。因此dubbo版本升级到2.7.1势在必行。二、版本升级从2.8.4升级到2.7.1具体可以参考:DubboSpringBoot(v2.7.1): ht