您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > IOS

为了一个HTTP请求问题,差点和iOS干起来

时间:2023-03-14 14:14:52  来源:今日头条  作者:程序员的成长

本次斗殴事件起因全部归IOS,为啥这么说,http请求都不会发,瞎写的什么玩意(ps:他应该不会看到...)。

在处理本次冲突中,意外发现了另外一个存在已久的bug,我们先说说这个玩意,再说我们之间的恩怨。因为这是息息相关的。

SpringBoot中的过滤器

过滤器这东西应该很常见了,但是你的过滤器真的起到拦截的作用了吗?这里就算你起到拦截的作用了,但是你的过滤器能拦截到指定的路径吗?先看一下我原始写法。

谨慎参考:

@WebFilter(filterName = "baseFilter", urlPatterns = "/*")
public class BaseFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChAIn filterChain) {

        System.out.println("baseFilter 拦截了 /*");
        
        filterChain.doFilter(req, resp);
    }
}

首先这里说下,如果你这是特别单纯的加个@WebFilter就以为ok了,那我告诉你,脸会被打的很疼的。

因为这个注解是servlet的,所以你一定要记得在启动类上加@ServletComponentScan此注解,这样在应用启动的时候,过滤器才会被扫描到。

我们写了一个Controller的接口访问了下,可以看到拦截器确实拦截到了我们的请求。

 

你以为的只是你以为

我们项目有时候大了,不知道引入了什么东西,有时候会导致这个过滤器呢就无法被注入,看到那行报错呢可能脑子还没反应过来,但是CV大法已经打开了度娘,找到了问题原因,度娘说你加个@Commponent注解好了。然后也确实好了,然后接下来他都如何操作。

@Component
@WebFilter(filterName = "baseFilter", urlPatterns = "/user/*")
public class BaseFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) {

        HttpServletRequest request = (HttpServletRequest) req;

        String url = request.getRequestURL().toString();

        System.out.println(url);
        System.out.println("baseFilter 拦截了 /*");
        
        filterChain.doFilter(req, resp);
    }
}

然而,不巧的是加了@Component注解虽然解决了问题,但是呢urlPatterns拦截的指定路径却没有生效。

我这里是一个pub开头的请求,拦截器拦截的user开头的,然后如下:

 

他居然将所有的请求给我拦截了下来,不是我想象的那样,那我们该如何解决这种问题呢?往下看同学。

SpringBoot如何注入过滤器

这里我就不列举众多的注入方式了,以免混淆大家,我就直接告诉你们怎么正确注入就ok了,本人已经亲测,而且管理起来很是方便。

过滤器写法

过滤器除了实现Filter之外,不要加任何的东西,就是这么简单。

public class BaseFilter implements Filter {


    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) {

        HttpServletRequest request = (HttpServletRequest) req;

        String url = request.getRequestURL().toString();

        System.out.println(url);
        System.out.println("baseFilter 拦截了 /*");
        
        filterChain.doFilter(req, resp);
    }
}

过滤器注入

我们这里直接通过配置类的方式将过滤器注入,这样呢,我们这里也一目了然,看到我们所有的过滤器,以及过滤器规则。

下面的这些参数都是基本配置,基本都是必填,name你就写过滤器的类名,首字母小写就好了,order就是过滤器的执行顺序,数字越小,越先执行。

这样我们一个完整的过滤器就配置好了。当你再访问/pub接口时,是不会被BaseFilter拦截到的。

「这里也推荐大家以后尽量这样去配置。」

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<BaseFilter> baseFilter() {
        FilterRegistrationBean<BaseFilter> filterBean = new FilterRegistrationBean<>();
        filterBean.setFilter(new BaseFilter());
        filterBean.setName("baseFilter");
        filterBean.addUrlPatterns("/user/*");
        filterBean.setOrder(1);
        return filterBean;
    }
}

我与iOS的一战

我们先看报的错,再来聊聊这次的锅我是怎么甩的

RequestRejectedException: The request was rejected because the URL was not normalized.

看到没因为网址不标准,导致请求被拒绝。

非说我接口有问题,本来想奋起反抗,看到对方比我身材威猛,想想还是抓到实质性证据在甩他吧。

既然说请求网址不正确,我猜测就是请求路径中是不是有什么猫腻,那我们就抓包呗。

最后在我们各种手段之下拿到了真凭实据。诸位法官请看:

他的请求路径:http://127.0.0.1:8080//user/list

他的请求路径中出现了双斜杠,这样肯定报错啊。这里需要说明下,报错是因为引入了Security安全框架

既然已经确定问题,那我必须奋起反抗,找他甩锅,当他看到这个时候,对吧自己也无话可说,只能默默的把锅背上。

就这样我这次又顺利的甩锅成功。

解决与反思

虽然锅甩出去了,但是问题还是要解决的。

其实按正常逻辑来说,不管我们引入了什么东西,只要请求路径正确,即使路径中出现再多的斜杠,我们也应该做好处理,不能影响用户的访问。所以我们就通过过滤器进行一个处理。

public class UriFormatFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain)
            throws ServletException, IOException {

        // 路径隔离符号
        String separateSymbol = "/";

        String uri = req.getRequestURI();
        StringBuilder newUrl = new StringBuilder();

        String[] split = uri.split(separateSymbol);

        for (String s : split) {
            if (StringUtils.isNotBlank(s)) {
                newUrl.Append(separateSymbol).append(s);
            }
        }

        req = new HttpServletRequestWrapper(req) {
            @Override
            public String getRequestURI() {
                return newUrl.toString();
            }
        };
        filterChain.doFilter(req, res);
    }
}

最后将过滤器注入

这里order为啥写-100,如果你写1,你以为它会是第一个执行,其实不然,在执行他之前,可能框架的一些过滤器会先执行,所以为了保险起见,我们就设置为-100,确保请求进来之后先走它。

@Bean
public FilterRegistrationBean<UriFormatFilter> uriFormatFilter() {
    FilterRegistrationBean<UriFormatFilter> filterBean = new FilterRegistrationBean<>();
    filterBean.setFilter(new UriFormatFilter());
    filterBean.setName("uriFormatFilter");
    filterBean.addUrlPatterns("/*");
    filterBean.setOrder(-100);
    return filterBean;
}

注意

如果你在过滤器中注入了一些Mapper、Service之类的话,可能会出现问题,调用的时候被注入的对象可能是个null,这就涉及到类的加载顺序,我就不在这里bibi了,真有人遇到了再说。反正我已经解决了[Doge]。

撕逼阶段

开发中,特别是小公司,很需要会多端的人来协调问题;有时候这种问题恶心之处在于:后端可以解决,移动端也可以解决,谁处理了显得就是谁的问题。

各位你们平时都是怎么拉扯的呢?



Tags:iOS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
iOS 17.5进一步开放 游戏可官网下载直接安装
苹果iOS 17.5版本系统将在近期开放测试,在该版本中,苹果会进一步开放侧载功能,让用户能够如同安卓手机那样,随意安装应用。据外媒消息称,苹果iOS 17.5版本系统将在近期开放测试,在...【详细内容】
2024-04-02  Search: iOS  点击:(7)  评论:(0)  加入收藏
揭秘 iOS 17.4:欧盟独享功能,其他地区无法体验
【环球网科技综合报道】据外媒消息,随着iOS 17.4的发布,欧洲用户能够独享一些全球其他地区无法获得的新功能。这得益于欧洲联盟的《数字市场法案》,苹果不得不向侧载等功能开放...【详细内容】
2024-03-18  Search: iOS  点击:(15)  评论:(0)  加入收藏
苹果iOS17.4值得升级吗?续航信号评测来了
苹果iOS17.4值得升级吗?很多iPhone用户都在纠结这个版本续航和信号都有没提升,纠结是否需要升级,那么这个版本信号信号到底怎样呢?下面就给大家分享iPhone13升级iOS17.4的续航信...【详细内容】
2024-03-07  Search: iOS  点击:(10)  评论:(0)  加入收藏
苹果“安全”神话破灭?!iOS首次出现木马病毒
一直以来,iOS系统都以“安全性极高”闻名手机圈。在封闭软硬件生态加持下,iOS确实要比安卓系统更安全点。但是,小雷要说但是了嚯,最近iOS却首次出现了木马病毒。图源:苹果近日,在...【详细内容】
2024-02-19  Search: iOS  点击:(66)  评论:(0)  加入收藏
木马病毒蔓延至iOS:苹果用户如何防范?
近期,网络安全公司Group-IB发布了一份引人注目的报告,揭示了黑客已经开始针对iPhone用户发起银行木马攻击。这一事件标志着iOS系统首次遭受此类安全威胁,为全球的苹果用户敲响...【详细内容】
2024-02-18  Search: iOS  点击:(40)  评论:(0)  加入收藏
黑客利用iOS系统中的三个零日漏洞在iPhone上安装间谍软件
2月7日,据谷歌威胁分析小组(TAG)发布的报告,黑客成功利用存在于苹果iOS系统中的三个零日漏洞,在iPhone上安装了由Variston开发的间谍软件。Variston是一家位于巴塞罗那的网络公司...【详细内容】
2024-02-07  Search: iOS  点击:(57)  评论:(0)  加入收藏
一夜之间,iOS放开了侧载和NFC等限制:苹果的欧洲福利
在最新的iOS更新中,苹果似乎放宽了一些长期以来受到限制的功能。据报道,新版本的iOS开放了侧载和NFC等功能的访问,这对于欧洲地区的用户来说无疑是一个巨大的福利。侧载,即从第...【详细内容】
2024-01-26  Search: iOS  点击:(53)  评论:(0)  加入收藏
部分iPhone用户升级iOS 17.3失败 提示“无法验证更新”
【CNMO新闻】近日,CNMO从外媒获悉,部分iPhone用户在升级iOS 17.3时遇到问题,手机会提示“无法验证更新”。iOS 17.3据悉,苹果社区的一些成员和部分Reddit用户反映,他们无法下载更...【详细内容】
2024-01-26  Search: iOS  点击:(59)  评论:(0)  加入收藏
苹果iOS 17.3正式版发布:修复诸多安全漏洞
北京时间2023年1月23日凌晨,苹果向iPhone用户推送了iOS 17.3更新(内部版本号为21D50),此次更新距离上次时隔34天。iOS 17.3的安装包大小为600MB左右。尽管更新包容量不大,但iOS 1...【详细内容】
2024-01-23  Search: iOS  点击:(43)  评论:(0)  加入收藏
电脑启动故障排查:硬盘丢失、BIOS恢复失败,一篇文章帮你解决!
如果系统无法启动到Windows,可能是因为 BIOS 损坏,通常表现为No POST 或No Boot。系统的BIOS/UEFI 是硬件和软件之间的桥梁,因此如果系统无法启动,可能是 BIOS 出现故障。您可以...【详细内容】
2024-01-19  Search: iOS  点击:(54)  评论:(0)  加入收藏
▌简易百科推荐
iOS 屏幕旋转的实践解析
屏幕旋转是在视频直播类 APP 中常见的场景,在即构科技之前发布的 Roomkit SDK 中也有屏幕跟随手机自动旋转的场景。 在 Roomkit SDK 自身开发和客户接入的过程中我们也会发现...【详细内容】
2023-11-02    51CTO  Tags:iOS   点击:(199)  评论:(0)  加入收藏
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
引言在iOS应用发布过程中,有时候会遇到使用无密码的.p12文件的情况。然而,在一些第三方平台上,可能会设置前端校验,不允许上传空密码的.p12文件。对于开发者来说,这样的情况会造...【详细内容】
2023-10-23  慕ie    Tags:iOS   点击:(204)  评论:(0)  加入收藏
解决提交到App Store时的ITMS-90478和ITMS-90062错误
正文1. 什么是ITMS-90478和ITMS-90062错误?2. 解决方法2.1 确定当前的版本号和构建号2.2 递增版本号和构建号2.3 再次尝试提交应用总结参考资料错误记录摘要:本文为iOS技术博...【详细内容】
2023-10-20  慕ie    Tags:App Store   点击:(231)  评论:(0)  加入收藏
iOS代码混淆和加固技术详解
摘要:本文介绍了iOS开发中常用的代码混淆和加固技术,包括数据加密、应用加壳和代码混淆。其中,重点讨论了代码混淆的实现方法和注意事项,并推荐了一些相关的工具和库。引言在开...【详细内容】
2023-10-17  慕ie    Tags:iOS   点击:(255)  评论:(0)  加入收藏
苹果上架c流程的详细步骤
摘要:本文将为iOS技术博主介绍苹果上架App备案流程的详细步骤,包括注册开发者账号、创建App ID、创建证书、创建Provisioning Profile、开发应用程序、提交应用程序、审核和上...【详细内容】
2023-09-08  慕ie    Tags:App备案   点击:(203)  评论:(0)  加入收藏
DDD实战 - Repository模式的妙用
大家好,我是飘渺。今天我们继续更新DDD(领域驱动设计) & 微服务系列。在之前的文章中,我们探讨了如何在DDD中结构化应用程序。我们了解到,在DDD中通常将应用程序分为四个层次,分别...【详细内容】
2023-07-07    JAVA日知录  Tags:DDD   点击:(255)  评论:(0)  加入收藏
iOS抓包最简单方案
写过爬虫的同学都知道,当我们想对App或者小程序进行抓包时,最常用的工具是Charles、Fiddler或者MimtProxy。但这些软件用起来非常复杂。特别是当你花了一两个小时把这些软件搞...【详细内容】
2023-07-07    未闻Code  Tags:iOS   点击:(234)  评论:(0)  加入收藏
iOS使用FFmpeg命令行
官方文档 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。 FFmpeg的代码是包括两部分...【详细内容】
2023-03-23  音视频开发T哥  今日头条  Tags:FFmpeg   点击:(222)  评论:(0)  加入收藏
为了一个HTTP请求问题,差点和iOS干起来
本次斗殴事件起因全部归iOS,为啥这么说,http请求都不会发,瞎写的什么玩意(ps:他应该不会看到...)。在处理本次冲突中,意外发现了另外一个存在已久的bug,我们先说说这个玩意,再说我们...【详细内容】
2023-03-14  程序员的成长  今日头条  Tags:iOS   点击:(164)  评论:(0)  加入收藏
新手学IOS开发-APP界面布局基础开发
上一篇文章写到IOS开发环境搭建,还没学会的读者可参考IOS开发环境搭建,今天我们熟悉一下开发工具的基本使用,为了对IOS软件开发有一个基础的认识,同时提升学习兴趣,我们先实现一...【详细内容】
2023-02-28  蒲公英互联    Tags:IOS   点击:(231)  评论:(0)  加入收藏
站内最新
站内热门
站内头条