Java HttpServletRequest:如何确定请求资产的内容类型

Java HttpServletRequest:如何确定请求资产的内容类型,java,jetty,content-type,servlets,Java,Jetty,Content Type,Servlets,我正在使用Jetty编写一个快速而肮脏的静态文件服务器。我需要为每个响应设置内容类型: HttpServletResponse.setContentType("content/type"); 对于给定的文件请求,如何可靠地确定要设置的内容类型?这是一个检查文件扩展名的问题,还是有更复杂的方法?(例如,如果没有文件扩展名,或者扩展名不反映内容类型,该怎么办?) 谢谢Richard,你可以用 您不能只检查请求头内容类型并将响应设置为该类型吗 我不知道你打算支持哪种类型的客户端,但如果它们是浏览器,

我正在使用Jetty编写一个快速而肮脏的静态文件服务器。我需要为每个响应设置内容类型:

HttpServletResponse.setContentType("content/type");
对于给定的文件请求,如何可靠地确定要设置的内容类型?这是一个检查文件扩展名的问题,还是有更复杂的方法?(例如,如果没有文件扩展名,或者扩展名不反映内容类型,该怎么办?)

谢谢Richard,你可以用


您不能只检查请求头
内容类型
并将响应设置为该类型吗

我不知道你打算支持哪种类型的客户端,但如果它们是浏览器,我想你应该不会介意。如果您控制客户机,那么不管怎样,客户机都会向您发送该标题,这是一个很好的做法


祝你好运

由于您在问题中使用的是HttpServletResponse对象,因此我假设您的控制器中有可用的ServletContext。我只是使用servletContext中可用的方法解决了这个问题

由于您正在编写一个文件服务器,您只需在ServletContext的getMimeType方法中传入文件的路径,如果可以确定的话,它应该返回mimeType

String path = "/js/example.js";
String mimeType = getServletContext().getMimeType(path);
resp.setContentType(mimeType);   // HttpServletResponse object
注意:在这个特定示例中,将内容类型设置为“application-x/javascript”


其他信息:我认为此解决方案还假设您的文件存储在ServletContext可以访问的位置。如果不是,那么其他解决方案之一可能是最好的。

我支持的客户端仅支持浏览器。这是一个有趣的建议,我将对此进行调查。我知道两种解决方案:-来自JavaBeans激活框架(似乎在JavaSE6中可用)-关于这个主题,有很多我没有尝试过的解决方案。你应该看看这个库。它做了很多事情(文件扩展名、魔法数据和内容嗅探)来确定内容类型:不确定这是否符合您的要求,但我最近发布了我的包,它实现了与Unix文件(1)命令相同的功能。它使用内部配置文件,或者可以读取
/etc/magic
/usr/share/file/magic
,或其他magic(5)文件,并从
文件
输入流
字节[]
确定文件内容。的位置、javadocs和一些文档可从中获得。使用SimpleMagic,您可以执行以下类似SimpleMagic的操作:
String path = "/js/example.js";
String mimeType = getServletContext().getMimeType(path);
resp.setContentType(mimeType);   // HttpServletResponse object