当前位置: 首页 > news >正文

spring-security原理与应用系列:ignoredRequests

目录

WebSecurityConfig

何时调用 configure(WebSecurity)

AbstractConfiguredSecurityBuilder

如何赋值ignoredRequests


        紧接上一篇文章,这一篇我们来看看核心过滤器FilterChainProxy的构造参数对象ignoredRequests是如何被赋值的?

        点击WebSecurity的performBuild()方法,如下:

@Overrideprotected Filter performBuild() throws Exception {List<SecurityFilterChain> securityFilterChains = new ArrayList<SecurityFilterChain>(chainSize);for (RequestMatcher ignoredRequest : ignoredRequests) {securityFilterChains.add(new DefaultSecurityFilterChain(ignoredRequest));}for (SecurityBuilder<? extends SecurityFilterChain> securityFilterChainBuilder : securityFilterChainBuilders) {securityFilterChains.add(securityFilterChainBuilder.build());}FilterChainProxy filterChainProxy = new FilterChainProxy(securityFilterChains);if (httpFirewall != null) {filterChainProxy.setFirewall(httpFirewall);}filterChainProxy.afterPropertiesSet();Filter result = filterChainProxy;postBuildAction.run();return result;}

        通过前面的文章,我们知道这里是创建核心过滤器对象的方法。

        在这里,我们知道securityFilterChains列表对象是核心过滤器的构造参数,其中,该列表对象有一部分内容是来自于ignoredRequests这个WebSecurity的属性。

        通过前面的文章,我们也知道,通过在自定义配置类里重写方法configure(WebSecurity web),可以让WebSecurity对象的ignoredRequests属性有值。

        自定义配置如下所示:

WebSecurityConfig

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

... ...

public void configure(WebSecurity web) {
   web.ignoring()
      .antMatchers("/css/**", "/js/**")
      .regexMatchers("/api/public/.*");
}

        接下来,我们要探究两个问题:

        其一,自定义配置类里的方法configure(WebSecurity web)何时被调用?

        其二,自定义配置内容是如何影响到ignoredRequests属性的?

何时调用 configure(WebSecurity)

        通过前面的文章,我们知道AbstractConfiguredSecurityBuilder的doBuild()方法,保存了构建核心过滤器的所有步骤。

        点击进入,如下所示:

AbstractConfiguredSecurityBuilder

@Override
protected final O doBuild() throws Exception {
   synchronized (configurers) {
      buildState = BuildState.INITIALIZING;
      beforeInit();
      init();
      buildState = BuildState.CONFIGURING;
      beforeConfigure();
      configure();
      buildState = BuildState.BUILDING;
      O result = performBuild();
      buildState = BuildState.BUILT;
      return result;
   }
}

        在这里,步骤configure看着跟我们要解决的问题关系比较大,点击configure(),如下所示:

private void configure() throws Exception {
   Collection<SecurityConfigurer<O, B>> configurers = getConfigurers();
   for (SecurityConfigurer<O, B> configurer : configurers) {
      configurer.configure((B) this);
   }
}

        在这里,果不其然,调用了自定义配置类的configure(WebSecurity)方法,并将当前的WebSecurity对象作为参数传递给配置类方法。

如何赋值ignoredRequests

        点击自定义配置类配置内容的web.ignoring(),如下所示:

public WebSecurity.IgnoredRequestConfigurer ignoring() {
    return this.ignoredRequestRegistry;
}

        在这里,返回WebSecurity建造者的属性ignoredRequestRegistry该属性类型为WebSecurity建造者的内部类IgnoredRequestConfigurer该类继承于AbstractRequestMatcherRegistry

        点击配置类配置内容的.antMatchers("/css/**", "/js/**"),如下所示:

public abstract class AbstractRequestMatcherRegistry<C> {
    ... ...
    public C antMatchers(String... antPatterns) {
        return this.chainRequestMatchers(AbstractRequestMatcherRegistry.RequestMatchers.antMatchers(antPatterns));
    }

        在这里,这是IgnoredRequestConfigurer的父类。

        点击RequestMatchers.antMatchers()方法,如下所示:

private static final class RequestMatchers {
    public static List<RequestMatcher> antMatchers(HttpMethod httpMethod, String...  antPatterns) {
        String method = httpMethod == null?null:httpMethod.toString();
        List<RequestMatcher> matchers = new ArrayList();
        String[] var4 = antPatterns;
        int var5 = antPatterns.length;
        for(int var6 = 0; var6 < var5; ++var6) {
            String pattern = var4[var6];
            matchers.add(new AntPathRequestMatcher(pattern, method));
        }
        return matchers;
    }

        在这里,这是一个静态方法,将String类型的请求地址串转换为RequestMatcher对象,这个类型也正是ignoredRequests对象的类型。

        让我们回到上一步,点击chainRequestMatchers()方法,如下所示:

public class IgnoredRequestConfigurer extends AbstractRequestMatcherRegistry<WebSecurity.IgnoredRequestConfigurer> {
    ... ...
    protected WebSecurity.IgnoredRequestConfigurer chainRequestMatchers(List<RequestMatcher> requestMatchers) {
        WebSecurity.this.ignoredRequests.addAll(requestMatchers);
        return this;
    }

        在这里,终于看到ignoredRequests对象了。原来,WebSecurity是通过属性ignoredRequestRegistry的方法来将自定义配置的请求地址串注册到WebSecurity建造者对象。

疏漏之处恭请雅正,良策佳议敬候惠示,凡所赐教必当铭感于心。

相关文章:

spring-security原理与应用系列:ignoredRequests

目录 WebSecurityConfig 何时调用 configure(WebSecurity) AbstractConfiguredSecurityBuilder 如何赋值ignoredRequests 紧接上一篇文章&#xff0c;这一篇我们来看看核心过滤器FilterChainProxy的构造参数对象ignoredRequests是如何被赋值的&#xff1f; 点击WebSecurity…...

(windows)conda虚拟环境下open-webui安装与启动

一、创建conda环境 重点强调下&#xff0c;如果用python pip安装&#xff0c;一定要选择python3.11系列版本&#xff0c;我选的3.11.9。 如果你的版本不是这个系列&#xff0c;将会出现一些未知的问题。 conda create -n open-webui python3.11 -y如下就创建好了 二、安装o…...

CentOS系统下安装tesseract-ocr5.x版本

CentOS系统下安装tesseract-ocr5.x版本 安装依赖包&#xff1a; yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC&#xff08;因系统默认安装的GCC版本比较…...

第五周日志-伪协议(3)

常见读取源码的file&#xff0c;php://filter和各种编码 还有执行php的 php://input和各种编码&#xff0c;data 在进行文件包含之前&#xff0c;先定位一下 Flag 文件的位置&#xff08;这里可以使用工具扫&#xff09; or直接访问 /flag.php 文件&#xff0c;结果返回为空&…...

飞牛NAS本地部署小雅Alist结合内网穿透实现跨地域远程在线访问观影

文章目录 前言1. VMware安装飞牛云&#xff08;fnOS&#xff09;1.1 打开VMware创建虚拟机1.3 初始化系统 2. 飞牛云搭建小雅Alist3. 公网远程访问小雅Alist3.1 安装Cpolar内网穿透3.2 创建远程连接公网地址 4. 固定Alist小雅公网地址 前言 嘿&#xff0c;小伙伴们&#xff0c…...

十七天-Numpy 学习笔记

Numpy 学习笔记 Numpy 作为 Python 中用于进行科学计算的核心库&#xff0c;提供了高性能的多维数组对象&#xff0c;以及大量用于数组操作的工具。下面围绕 “常量”“数据类型”“时间日期和时间增量” 三个方面&#xff0c;梳理 Numpy 中基本的数据概念和数组创建相关知识。…...

浅谈WebSocket-FLV

FLV是一种视频数据封装格式&#xff0c;这种封装被标准通信协议HTTP-FLV和RTMP协议应用。 而WebSocket-FLV是一种非标的FLV封装数据从后端发送到前端的一种方式。 在WebSocket的url请求中&#xff0c;包含了需要请求设备的视频相关信息&#xff0c;在视频数据到达时&#xff0c…...

milvus-use教程 python

简介 项目地址&#xff1a;milvus-use: milvus-use教程 python 需求描述 参考vanna项目&#xff0c;获取数据库元数据和问题sql对&#xff0c;存入Milvus向量数据库&#xff0c;之后进行检索&#xff0c;返回相似的数据库表和问题对。本项目采用的嵌入模型为m3e-large。该该…...

Python列表生成式

Python 的 列表生成式&#xff08;List Comprehension&#xff09; 是一种简洁高效的创建列表的方式&#xff0c;可以用一行代码替代多行循环逻辑。 传统的循环的写法 # 循环遍历列表中的每个元素&#xff0c;并将其平方后添加到新的列表中 original [0, 1, 2, 3, 4] squares…...

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表&#xff0c;该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all&#xff08;尽量不要删&#xff09;&#xff0c;使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer&#xff1b;找不到合适颜色…...

Cursor异常问题全解析-无限使用

title: Cursor异常问题全解析无限使用 tags: cursor categories:aiai编程 mathjax: true description: Cursor异常问题全解析与解决方案大全 abbrlink: 64908bd0 date: 2025-03-19 14:48:32 &#x1f916; Assistant &#x1f6a8; Cursor异常问题全解析与解决方案大全 &…...

Ubuntu系统保姆级Paperless-ngx部署指南:零基础实现文档云端化管理

文章目录 前言1.关于Paperless-ngx2.Docker部署3.简单使用paperless4.安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在当今快节奏的办公环境中&#xff0c;文档管理成为了一个不可忽视的问题。想象一下这样的场景&#xff1a;你需要一份重要的合同&#xf…...

资本运营:基于Python实现的资本运作模拟

基于Python实现的一个简单的资本运营框架&#xff1b; ​企业生命周期演示&#xff1a;观察初创→成长→上市→并购全流程 ​行业对比分析&#xff1a;不同行业的财务特征和估值差异 ​资本运作策略&#xff1a;体验IPO定价、投资决策、并购整合等操作 ​市场动态观察&#xff…...

每日总结3.27

蓝桥刷题 1. 团建 &#xff08;树dfs&#xff09; #include <bits/stdc.h> using namespace std; const int N200005; int a[N],b[N]; int ans; map<int,vector<int>>m1,m2; void dfs(int x,int y,int count) { if(a[x]!b[y]) {return;} ansmax(ans,c…...

3-2RYU控制器应用程序开发(一)

图1 SDN框架 通过利用Ryu框架的丰富功能以及RYU应用程序开发中的事件驱动&#xff08;装饰器&#xff09;的编程模型&#xff0c;我们能够开发符合需求的SDN控制器应用程序。通过开发的RYU控制器可以实现各种网络策略控制和管理功能。在SDN软件定义网络编程中&#xff0c;RYU应…...

算法250327题目

1114: 4006 AB问题 题目描述 给定两个整数A和B&#xff0c;其表示形式是&#xff1a;从个位开始&#xff0c;每三位数用逗号,隔开。 现在请计算AB的结果&#xff0c;并以正常形式输出。 输入 输入包含多组数据&#xff0c;每组数据占一行&#xff0c;由两个整数A和B组成&am…...

数据结构:汉诺塔问题的递归求解和分析

递归方法求解该类问题&#xff0c;是一种简单的思维方法&#xff0c;通常比使用迭代方法更简单。但是&#xff0c;递归方法也有劣势。此处以典型的汉诺塔问题&#xff08;Tower of Hanoi&#xff09;为例给予说明。 汉诺塔是根据一个传说形成的数学问题&#xff0c;最早是由法国…...

编辑器检视器面板简单扩展2+编辑器检视器面板深度扩展1

枚举检视器面板显示 代码&#xff1a; public enum Profession {Warrior0,Wizard } public Profession Pro; //在类中声明 小齿轮增加回调函数 点击控制台输出&#xff1a; 代码&#xff1a; [ContextMenu("输出攻防比")]public void PrintADProportion(){Debug…...

二分查找模板--从题目中讲解三大二分模板

二分查找的特点&#xff1a;最恶心、细节最多、最容易写出死循环的算法 目录 1.朴素的二分模板 1.1题目链接&#xff1a;704.二分查找 1.2题目描述&#xff1a; 1.3算法流程&#xff1a; 1.4算法代码&#xff1a; 1.5朴素二分模板&#xff1a; 2.查找左,右边界的二分模板…...

EF Core 执行原生SQL语句

文章目录 前言一、执行查询&#xff08;返回数据&#xff09;1&#xff09; 使用 FromSqlRaw或 FromSqlInterpolated 方法&#xff0c;适用于 DbSet<T>&#xff0c;返回实体集合。2&#xff09;结合 LINQ 查询3&#xff09;执行任意原生SQL查询语句&#xff08;使用ADO.N…...

HiveChat:提升团队协作效率的AI聊天应用

什么是 HiveChat &#xff1f; HiveChat 作为一款专为中小团队设计的 AI 聊天应用&#xff0c;支持 Deepseek、Open AI、Claude、Gemini 等模型。管理员一人配置&#xff0c;全团队轻松使用各种 AI 模型。凭借其强大的功能和便捷的操作&#xff0c;有望成为团队沟通协作的得力助…...

python中的继承

目录 一、继承 单继承 多继承 方法的重写 一、继承 在Python中&#xff0c;继承是面向对象编程中的重要概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。子类可以继承父类的属性和方法&#xff0c;并且可…...

Vulnhub靶场FALL靶机通关攻略

1.打开靶机和kali 2.扫描靶机ip ​​​​​ 靶机ip为192.168159.158 3.访问下网站 翻阅一下 可能存在后门 网站根目录下可能有线索 4.爆破目录 ir -u http://192.168.159.158 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.bak,.txt,.sh,.ht…...

Java基础概念汇总

JavaEE Java基础概念面试题详解1. Java的特点是什么&#xff1f;2. Java和C的区别有哪些&#xff1f;3. 什么是JDK、JRE和JVM&#xff1f;它们之间有什么关系&#xff1f;4. Java是编译型语言还是解释型语言&#xff1f;5. Java如何实现跨平台&#xff1f; 数据类型与变量面试题…...

【服务端】使用conda虚拟环境部署Django项目

写在开头 为了与客户端的Deep search配合&#xff0c;需要整一个后台管理来保存和管理deep search的数据资料。选择前端框架Vue-Vben-Admin Django后台服务来实现这个项目。 废话结束&#xff0c;从零开始。。。。 一、环境搭建 1. 安装 Anaconda 下载 Anaconda&#xff1…...

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

引言 本文介绍了一种基于Pycatia二次开发的无参数模型孔特征识别技术&#xff0c;通过拓扑分析与几何特征检测双验证机制&#xff0c;实现圆形孔边线的精准识别及圆心坐标自动化生成。该方案可有效解决逆向工程、质量检测等场景下非参数化模型的孔位分析难题&#xff0c;提升三…...

cpu 比较低,load 比较高怎么解决

当系统出现 CPU 使用率低但 Load Average(系统负载)高 的情况时,通常意味着系统资源瓶颈不在 CPU,而可能出现在其他环节(如 I/O 等待、锁竞争、大量进程排队等)。以下是排查和解决问题的详细步骤: 一、理解 Load Average 的含义 Linux 系统的 Load Average 表示 单位时…...

qt QQuaternion详解

1. 概述 QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分&#xff0c;可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。 2. 重要方法 默认构造函数 QQuaternion::QQuaternion(); // 构造单位四元数 (1…...

伊利工业旅游4.0,近距离感受高品质的魅力

3月24日&#xff0c;在2025年第112届全国糖酒会&#xff08;简称春糖&#xff09;前夕&#xff0c;伊利集团“可感知高品质探寻荟”活动在成都召开&#xff0c;记者走进伊利在西南地区最大的乳制品生产基地—邛崃工厂&#xff0c;零距离见证液态奶、酸奶、冷饮等乳制品的诞生&a…...

前端面经分享(25/03/26)

北京一家做AI解决方案的公司&#xff0c;技术一面&#xff0c;15k-20k&#xff0c;要求3-5年 你们React项目里路由模式用的什么React里class组件和function组件都用过吗常用Hook&#xff0c;解释一下他们的作用useEffect第二个参数填空数组和不填有什么区别React组件通信的常用…...

unity实现图片查看器有限制的移动缩放功能

需求 unity实现键盘wasd键控制图片的移动&#xff0c;图片长度未超出屏幕不能移动&#xff0c;宽度未超出屏幕不能移动。jk键控制图片的缩放&#xff0c;缩放有限制 using UnityEngine;public class ImageController : MonoBehaviour {[Header("移动设置")]public f…...

STM32基础教程——输入捕获模式测量PWM频率

目录 前言 技术实现 原理图 连线图 代码实现 内容要点 PWM基本结构 开启外设时钟 配置GPIO端口 配置时基单元 初始化输出比较单元 输出比较通道重映射 输入捕获功能初始化 计算捕获PWM的频率 实验结果 问题记录 前言 IC&#xff08;Input Capture&#xff09;输…...

【redis】集群 如何搭建集群详解

文章目录 集群搭建1. 创建目录和配置2. 编写 docker-compose.yml完整配置文件 3. 启动容器4. 构建集群超时 集群搭建 基于 docker 在我们云服务器上搭建出一个 redis 集群出来 当前节点&#xff0c;主要是因为我们只有一个云服务器&#xff0c;搞分布式系统&#xff0c;就比较…...

Linux应用:线程基础

线程介绍 进程是程序在操作系统里的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的一个执行单元&#xff0c;是 CPU 调度和分派的基本单位。一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;如内存空间、文…...

力扣HOT100之普通数组:238. 除自身以外数组的乘积

这道题不能使用除法&#xff0c;我第一时间想到用前缀表和后缀表来解决&#xff0c;假设数组nums的长度为n&#xff0c;我们直接定义前缀表pre和后缀表suf&#xff0c;其中pre[i] pre[i - 1] * nums[i - 1] nums[0] * nums[1] * ... * nums[i - 1] &#xff0c;而suf[j] suf…...

PHP回调后门小总结

目录 1.call_user_func 函数说明 蚁剑连接 2.数组操作造成的单参数回调后门 array_filter 函数说明 蚁剑连接 array_map 函数说明 蚁剑连接 3.二参数回调函数 uasort 函数说明 uksort array_reduce array_udiff 蚁剑连接 4.三参数的回调后门 array_walk 函数说…...

《深度剖析SQL数据类型转换:隐式与显式的奥秘》

在SQL的世界里&#xff0c;数据类型转换是一个基础且关键的操作&#xff0c;它贯穿于数据库开发、管理与数据分析的各个环节。数据类型转换分为隐式转换和显式转换&#xff0c;二者各有特点与应用场景&#xff0c;深刻理解它们对于编写高效、稳定的SQL代码至关重要。 一、数据…...

通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍&#xff1a; DMA控制器可以生成单次传输或增量突发传输&#xff0c;传输的节拍数为4、8或16。 为了确保数据一致性&#xff0c;构成突发传输的每组传输都是不可分割的&#xff1a;AHB传输被锁定&#xff0c;AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备…...

多线程 --- 多线程编程

在写代码的时候&#xff0c;可以使用多进程进行并发编程&#xff08;在Java中&#xff0c;不太推荐&#xff0c;很多很多关于进程相关的API&#xff0c;在Java标准库中&#xff0c;都没有提供&#xff09;&#xff0c;也可以使用多线程进行并发编程&#xff08;系统提供了多线程…...

利用新一代雷达传感器增强ADAS系统的检测和计算(TI文档)

摘要 德州仪器 (TI) 的新一代雷达传感器AWR2E44P和AWR2944P推动了TI的ADAS雷达产品系列发展&#xff0c;专注于提 高性能以满足严格的 NCAP&#xff08;新车评估计划&#xff09;和 FMVSS&#xff08;联邦机动车辆安全标准&#xff09;自动驾驶和安全法规。这些雷 达器件为 AWR…...

前端工程化开篇

前端发展史梳理&#xff1a; 最早的html&#xff0c;css&#xff0c;js是前端三剑客&#xff0c;足以实现所有的前端开发任务&#xff0c;但是呢&#xff0c;一个简单的前端交互效果可能就需要一大堆的代码去实现。 后来呢&#xff0c;有了前端库jQuery&#xff0c;他可以使前…...

Android 问真八字-v2.1.7[看八字APP]

Android 问真八字 链接&#xff1a;https://pan.xunlei.com/s/VOMMuCVQRQrM2vRsHj14SsO0A1?pwdavzw# Android 问真八字-v2.1.7[看八字APP]...

go - grpc入门

前期准备 工具安装及使用 grpc开发 编写proto文件 proto文件是符合Protocol Buffers语言规范的数据交换协议文件&#xff0c;就像以前WebService定义服务时使用的XML文件。现在一般都是用proto3了&#xff0c;这里创建一个名为 hello.proto 的文件&#xff0c;放到项目的pr…...

Linux操作系统配置本地yum源和定时任务

操作系统环境&#xff1a;CentOS 7.2 本地yum源配置 1.挂载镜像 mount /dev/cdrom /mnt/cdrom 2.备份原yum配置 mv /etc/yum.repos.d /etc/yum.repos.d.bak 3.创建本地yum源配置文件 mkdir /etc/yum.repos.d vi /etc/yum.repos.d/CentOS-local.repo 添加内容&#xff1a; #本…...

【活动回顾】StarRocks Singapore Meetup #2 @Shopee

3 月 13 日&#xff0c;StarRocks 社区在新加坡成功举办了第二场 Meetup 活动&#xff0c;主题为“Empowering Customer-Facing Analytics”。本次活动在 Shopee 新加坡办公室举行&#xff0c;吸引了来自 Shopee、Grab 和 Pinterest 的专家讲师以及 50 多位参会者。大家围绕电商…...

优选算法——双指针专题

本章先分享关于优选算法的双指针的思路&#xff1a; 主要是以题目来展示常见使用双指针的思路。 ps: 双指针做法&#xff1a;不要被表面所迷惑&#xff0c;它其实是通过用一个数组的下标来充当指针 数组分两块&#xff1a;是⾮常常⻅的⼀种题型&#xff0c;主要就是根据⼀种…...

深度解析:TOML、XML、YAML及其他配置/数据格式对比

深度解析&#xff1a;TOML、XML、YAML及其他配置/数据格式对比 在软件开发和系统配置中&#xff0c;选择合适的配置或数据格式至关重要。本文将对比 TOML、XML、YAML 等常见格式&#xff0c;梳理它们的核心特性、适用场景及区别&#xff0c;并扩展介绍其他类似格式&#xff0c…...

冗余技术:堆叠技术+链路聚合

目录 前言 一.堆叠技术概述 二.堆叠技术原理 三.堆叠系统登录 四.堆叠合并/分裂 4.1 堆叠双主检测机制&#xff08;MAD&#xff09; 五.链路聚合技术概述 六.链路聚合模式 前言 在硬件加速与数据爆炸时代&#xff0c;堆叠技术通过模块化分层设计&#xff0c;实现资源动…...

存储服务器是指什么

今天小编主要来为大家介绍存储服务器主要是指什么&#xff0c;存储服务器与传统的物理服务器和云服务器是不同的&#xff0c;其是为了特定的目标所设计的&#xff0c;在硬件配置方式上也有着一定的区别&#xff0c;存储空间会根据需求的不同而改变。 存储服务器中一般会配备大容…...

文件上传绕过的小点总结(8)

16.apache解析漏洞条件竞争 class MyUpload{.................. var $cls_arr_ext_accepted array(".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",&q…...