Servlets 使用ServletContext#getMimeType()安全吗

Servlets 使用ServletContext#getMimeType()安全吗,servlets,mime-types,Servlets,Mime Types,更具体地说,我正在使用: public String getMimeType() { ServletContext context = request.getServletContext(); String filePath = request.getRequestURI().substring(request.getContextPath().length()+1, request.getRequestURI().length()); String fileName =

更具体地说,我正在使用:

public String getMimeType() {
    ServletContext context = request.getServletContext();
    String filePath = request.getRequestURI().substring(request.getContextPath().length()+1, request.getRequestURI().length());
    String fileName = context.getRealPath(filePath);        
    return context.getMimeType(fileName);
}
确定从客户端请求的文件类型(css、js、字体等)。根据文件的类型,会发生不同的操作。这是跨浏览器的一致性,还是基于url中传递的文件名来确定文件类型的安全方法,还是太容易中断

这在不同的浏览器中是一致的吗

与文件扩展名关联的mime类型位于此特定代码段中,而不是由客户端确定。它由服务器根据
web.xml
中的
条目确定。客户端可以控制的只是URL中的文件扩展名。但你已经知道了

因此,您最好问“这是跨服务器的吗?”。答案是否定的。每个服务器都有自己预定义的mime映射。较旧的服务器可能缺少对较新mime类型(如XLSX、SVG等)的映射。如果您想涵盖您感兴趣的每种mime类型,并且您无法控制目标服务器及其配置,那么最好在webapp自己的
web.xml
中显式映射它



与具体问题无关,请跳过
getRealPath()
废话。在一个像样的web应用程序中永远不需要它。此外,从技术上讲,这里根本不需要它。URI甚至是唯一的文件名对
getMimeType()
方法同样有效。

它基于文件扩展名,而不是文件内容,因此它可能不准确,因为不同的文件格式可能共享相同的扩展名。换句话说,上传文件是不可行的,但对于内部应用程序(请求我自己的资源),应该可以吗?我已经注意到资源调用中有很多随机的404,但还不能确定这是否是罪魁祸首。因此,request.getMimeType无法根据浏览器正在执行的操作返回空值?您现在正在切换。您的代码是
context.getMimeType()
,但现在您讨论的是
request.getMimeType()
。是哪一个?对不起,上下文…输入错误。如果您使用的是Tomcat,
Tomcat_HOME/conf/web.xml
文件包含文件扩展名到mime类型的所有默认映射,如
context.getMimetType
返回的。您自己的
WEB-INF/WEB.xml
文件中的任何映射都会扩展这些默认值。感谢您添加了这些映射。