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

Easter79
• 阅读 1003

前言

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

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

发现问题

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

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

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

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

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

分析问题

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

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

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

private static boolean isNormalized(String path) {
    if (path == null) {
        return true;
    } else if (path.indexOf("//") > -1) {
        return false;
    } else {
        int i;
        for(int j = path.length(); j > 0; j = i) {
            i = path.lastIndexOf(47, j - 1);
            int gap = j - i;
            if (gap == 2 && path.charAt(i + 1) == '.') {
                return false;
            }

            if (gap == 3 && path.charAt(i + 1) == '.' && path.charAt(i + 2) == '.') {
                return false;
            }
        }

        return true;
    }
}

解决问题

方法一:修改项目中出现“//”双斜杠的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。

@Override
public void configure(WebSecurity web) throws Exception {
    //@formatter:off
    super.configure(web);
    web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
....
}

至此,问题解决。

点赞
收藏
评论区
推荐文章
凯文86 凯文86
3年前
Spring Cloud 微服务开发指南
如同SpringBoot在JavaWeb开发领域中的统治地位,SpringCloud在Java微服务应用开发领域中同样处于垄断地位。软件系统从单体升级到微服务架构,随之会出现各种分布式系统所特有的问题,包括服务注册发现、认证授权、限流熔断、调用追踪等。SpringCloud提供了各种组件来解决这些问题,本文将通过升级改造一个单体AP
Wesley13 Wesley13
3年前
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
Wesley13 Wesley13
3年前
PHP连接MySQL 8.0报错的解决办法
MySQL升级到8.0之后,PHP连接报错怎么解决?作为资深的MySQL票友,最近我总在给8.0吹水,我们知数堂的MySQL课程去年也早就升级到8.0版本了。我的VPS老早就想升级了,无奈PHP版本太低,担心升级后有问题,所以一直没去折腾。这两天稍微得空,就开始折腾升级MySQL版本。为了解锁最香新功能,我直接升级到了最新的MySQL8.0.1
Stella981 Stella981
3年前
Service starting has been prevented by iaware or trustsbase sInfo ServiceInfo 解决方法
问题:ActivityManager:ServicestartinghasbeenpreventedbyiawareortrustsbasesInfoServiceInfo{c50ea35xxx.xxx.xxx.ServiceName}问题描述,该问题再华为部分手机升级到Android10.1之后,启动服务会
Stella981 Stella981
3年前
Druid时序数据库升级流程
目前Druid集群版本为0.11.0,新版本0.12.1已支持DruidSQL和Redis,考虑到Druid新特性以及性能的提升,因此需要将Druid从0.11.0版本升级到0.12.1版本,下面将对Druid升级步骤做详细的介绍,升级时请严格按照此步骤进行升级,以免出现一些不可预知的问题。1\.Druid升级包Dru
Stella981 Stella981
3年前
Dubbo版本升级
一、背景早期内部使用的是当当网fork的Dubbox,由于现在Dubbo又开始重新维护,而且阿里将其捐献给了Apache,并成为了Apache的顶级项目。因此dubbo版本升级到2.7.1势在必行。二、版本升级从2.8.4升级到2.7.1具体可以参考:DubboSpringBoot(v2.7.1): ht
Stella981 Stella981
3年前
SpringBoot整合升级Spring Security 报错 【The request was rejected because the URL was not normalized】
前言最近LZ给项目框架升级,从Spring1.x升级到Spring2.x,在这里就不多赘述两个版本之间的区别以及升级的原因。关于升级过程中踩的坑,在其他博文中会做比较详细的记录,以便给读者参考,不要掉进同样的坑里。这里我们讨论一个关于URL中包含双斜杠被拦截的问题。发现问题升级框架之后,测试一个功能时,发现报错Htt
Stella981 Stella981
3年前
Nginx升级Keepalive_Requests默认值变更
T婶早上同步了一个消息, Nginx代理和Upstream服务器之间在某种情况下一直发connection:close。Nginx从1.13.6升级到了1.15.8出现的问题,T婶牺牲了午休的时间堵上的这个坑,其根本原因,是升级到1.15.8之后,Nginx的长链接Keepalive\_Requests的默认值变成了:100。 过个这个极值就
Stella981 Stella981
3年前
ReactNative项目升级避坑指南
众所周知,ReactNative的项目升级是一个老大难问题,相信经历过版本升级的老铁们,心中的酸(ku)甜(bi)苦(ha)辣(ha)的感觉记忆犹新。因为ReactNative项目升级设计到Android项目,IOS项目以及Javascript项目三方面的修改,处理起来还是很麻烦的,经常是解决一个报错又出来一个新的报错,红色的报错框仿佛在一直提示升级的困难
Wesley13 Wesley13
3年前
MySQL5.7升级到8.0过程详解
前言:不知不觉,MySQL8.0已经发布好多个GA小版本了。目前互联网上也有很多关于MySQL8.0的内容了,MySQL8.0版本基本已到稳定期,相信很多小伙伴已经在接触8.0了。本篇文章主要介绍从5.7升级到8.0版本的过程及注意事项,有想做版本升级的小伙伴可以参考下。1.升级前准备及注意事项首先
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k