首页 > 其他分享 >文件上传时各配置目录优先级详解

文件上传时各配置目录优先级详解

时间:2024-05-31 13:21:50浏览次数:21  
标签:优先级 tomcat 上传 详解 location File spring new servlet

Tomcat配置目录有以下两个

1.spring.servlet.multipart.location:文件上传路径

2.server.tomcat.basedir:配置Tomcat运行日志和临时文件的目录。

如果生产中配置了这两个目录,当上传文件时,他们的优先级是?

       当上传文件时,代码执行到Request类,在发现使用时spring.servlet.multipart.location优先级高,源码可见Request类中的parseParts方法中的以下代码段。

            File location;
            //取MultipartConfigElement这个对象中的location属性即 
            //spring.servlet.multipart.location配置的值
            String locationStr = mce.getLocation();
            if (locationStr == null || locationStr.length() == 0) {
                //取server.tomcat.basedir配置的值
                location = ((File) context.getServletContext().getAttribute(
                        ServletContext.TEMPDIR));
            } else {
                // If relative, it is relative to TEMPDIR
                location = new File(locationStr);
                if (!location.isAbsolute()) {
                    location = new File(
                            (File) context.getServletContext().getAttribute(
                                        ServletContext.TEMPDIR),
                                        locationStr).getAbsoluteFile();
                }
            }

在上面的代码段中可以得出上传文件时

spring.servlet.multipart.location的优先级比server.tomcat.basedir的高。

源码分析:

 spring.servlet.multipart.location通过MultipartAutoConfiguration 这个类进行赋值。并通过该类中的以下方法注入MultipartConfigElement这个Bean。

当spring.servlet.multipart.location未配置时取ServletContext.TEMPDIR属性的值。

context.getServletContext().getAttribute(
        ServletContext.TEMPDIR)

其中ServletContext.TEMPDIR值为javax.servlet.context.tempdir,以该值为KEY.其值对应的value是在StandardContext类中的postWorkDirectory方法中设置到Map里去的。postWorkDirectory方法在tomcat启动时调用的startInternal方法里被调用。

其赋值源于

try {
    catalinaHomePath = getCatalinaBase().getCanonicalPath();
    dir = new File(catalinaHomePath, workDir);
} catch (IOException e) {
    log.warn(sm.getString("standardContext.workCreateException",
            workDir, catalinaHomePath, getName()), e);
}

catalinaHomePath的值源自Tomcat类中的initBaseDir方法赋值,赋的值依赖Tomcat类中的basedir属性,该属性是通过TomcatReactiveWebServerFactory类里的getWebServer方法赋值。basedir的值源自this.baseDirecotry。

public WebServer getWebServer(HttpHandler httpHandler) {
		Tomcat tomcat = new Tomcat();
        //baseDirectory属性来源于TomcatWebServerFactoryCustomizer#customize方法
		File baseDir = (this.baseDirectory != null) ? this.baseDirectory
				: createTempDir("tomcat");
		tomcat.setBaseDir(baseDir.getAbsolutePath());
		Connector connector = new Connector(this.protocol);
		tomcat.getService().addConnector(connector);
		customizeConnector(connector);
		tomcat.setConnector(connector);
		tomcat.getHost().setAutoDeploy(false);
		configureEngine(tomcat.getEngine());
		TomcatHttpHandlerAdapter servlet = new TomcatHttpHandlerAdapter(httpHandler);
		prepareContext(tomcat.getHost(), servlet);
		return new TomcatWebServer(tomcat, getPort() >= 0);
}

其中的baseDirectory是通过WebServerFactoryCustomizerBeanPostProcessor后置处理器通过         postProcessBeforeInitialization调用了函数的WebServerFactoryCustomizercustomize方法。该函数方法实际调用的时TomcatWebServerFactoryCustomizer中的customize方法。在该方法中可以看到下面的一段代码。该代码将server.tomcat.basedir配置的值赋值到ConfigurableTomcatWebServerFactory类型的对象中。

propertyMapper.from(tomcatProperties::getBasedir).whenNonNull()
      .to(factory::setBaseDirectory);

标签:优先级,tomcat,上传,详解,location,File,spring,new,servlet
From: https://www.cnblogs.com/liftsail/p/18224348

相关文章

  • Linux sar命令参数详解
    sar(SystemActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。sar命令常用格式sar[options][-A][-o......
  • UART、I2C、SPI协议详解
    文章目录前言UARTUART的工作原理数据帧结构数据传输过程发送数据接收数据举例说明UART的特点双线通信异步通信灵活的数据格式波特率选择UART的应用场景UART的优缺点优点缺点I2CI2C的工作原理总线架构数据传输过程总线仲裁举例说明I2C的特点I2C的应用场景I2C的优缺......
  • JS-08函数的4中调用方式详解
    目录1函数调用方式 2方法调用方式例1:声明一个对象,调用对象原型里的方法例2:直接调用对象里的方法例3:声明一个值为函数的变量clear,在一个对象tom里的某个属性c赋值为该变量clear,然后通过该对象tom调用这个变量c3构造函数调用方式例1:有一个函数,用new来赋值,则是赋值的......
  • 嵌入式linux系统中framebuffer应用开发详解
    大家好,今天给大家详细分析一下,利用framebuffer进行linux应用开发的详细方法。第一:LCD屏Framebuffer基本原理LCDFramebuffer就是一块显存.在嵌入式系统中.显存是被包含在内存中。LCDFramebuffer里的若干字节〈根据驱动程序对LCD控制器的配置而定〉表示LCD屏幕中的一个像素点.......
  • 算法金 | 详解过拟合和欠拟合!性感妩媚 VS 大杀四方
    大侠幸会,在下全网同名「算法金」0基础转AI上岸,多个算法赛Top「日更万日,让更多人享受智能乐趣」今天我们来战过拟合和欠拟合,特别是令江湖侠客闻风丧胆的过拟合,简称过儿,Emmm过儿听起来有点怪怪的1.楔子机器学习模型是一种能够从数据中学习规律并进行预测的算法。......
  • 深度神经网络详解
    一、引言随着人工智能和机器学习的发展,深度神经网络(DeepNeuralNetworks,DNNs)已经成为解决许多复杂问题的关键技术。从图像识别到自然语言处理,深度神经网络在各个领域的应用都取得了显著的成果。本篇博客将详细介绍深度神经网络的基本概念、结构、训练过程以及一些常见的应用......
  • DeerOJ 的题目上传流程(以传统提交为例)
    前言在OJ上上传题目的话,你需要题目描述的模板(以markdown形式),测试数据等。在DeerOJ上,除了这些,还需要一些额外的操作配置。题目、数据准备以前年新生赛的9数为例,题目描述的md文件如下:上传的数据以nine为前缀,输入输出文件分别以in和out为后缀,序号从1开始(注意不是从0开始......
  • 模型节点操作学习笔记(1)--SavedModel详解
    参考:使用SavedModel格式 | TensorFlowCore(google.cn) (持续更新)   SavedModel是一个包含序列化签名和运行这些签名所需的状态的目录,其中包含变量值和词汇表。$ls{mobilenet_save_path}assetsfingerprint.pbsaved_model.pbvariablesassets目......
  • Milvus向量数据库详解
    Milvus向量数据库是一款专为向量查询与检索设计的云原生数据库,它具备高性能、高可用、易拓展的特点,主要用于处理由深度神经网络和其他机器学习模型生成的Embedding向量。以下是关于Milvus向量数据库的详细说明:定义与用途:Milvus是一款云原生向量数据库,专为处理海量向量数据......
  • WEB安全:Content Security Policy (CSP) 详解
    ContentSecurityPolicy(CSP)是一种强大的网页安全机制,用于防止跨站脚本(XSS)和其他注入攻击。通过设置一系列的内容安全策略,CSP可以限制网页可以加载的资源,从而保护用户数据和网站的安全性。什么是XSS攻击?跨站脚本攻击(XSS)是一种常见的安全漏洞,攻击者通过注......