Wildfly Undertow文件Mimetypes [英] Wildfly Undertow File Mimetypes

查看:245
本文介绍了Wildfly Undertow文件Mimetypes的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望Undertow提供静态文件,如.jpg,.png,.js,.css,.txt等...

I want Undertow to serve static files like .jpg, .png, .js, .css, .txt etc...

我编辑了下载子系统standalone.xml:

I edited the undertow subsystem in standalone.xml:

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
        <buffer-cache name="default"/>
        <server name="default-server">
            <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
            <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
            <host name="default-host" alias="localhost">
                <location name="/images" handler="sh-resources"/>
                <filter-ref name="server-header"/>
                <filter-ref name="x-powered-by-header"/>
                <filter-ref name="content-png" predicate="path-suffix['.png']"/>
                <http-invoker security-realm="ApplicationRealm"/>
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
            <websockets/>
        </servlet-container>
        <handlers>
            <file name="sh-resources" path="/resource" directory-listing="true"/>
        </handlers>
        <filters>
            <response-header name="server-header" header-name="Server" header-value="WildFly/11"/>
            <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
            <response-header name="content-png" header-name="Content-Type" header-value="image/png"/>
        </filters>
    </subsystem>

我的/ resource文件夹1.jpg,2. png中有一些文件,js.js,c.cssin:

I hav some files in my "/resource" folder "1.jpg", "2.png", "js.js", "c.css" in:

http:// localhost:8080 / resource / 1.jpg - >在浏览器中不显示任何内容

http://localhost:8080/resource/1.jpg --> shows nothing in browser

http:// localhost:8080 / resource / 2.png - >浏览器中没有显示任何内容

http://localhost:8080/resource/2.png --> shows nothing in browser

http:// localhost:8080 / resource / js.js - >在浏览器中不显示任何内容

http://localhost:8080/resource/js.js --> shows nothing in browser

http:// localhost:8080 / resource / c.css - >在浏览器中显示文件内容

http://localhost:8080/resource/c.css --> shows file content in browser

http:// localhost:8080 / resource / test.html - >在浏览器中显示文件内容

http://localhost:8080/resource/test.html --> shows file content in browser

为什么我看不到图像但可以看到css& HTML内容?我认为是因为mimetype设置不正确?

Why cant I see the images but can see the css & html content ? I think its because of incorrect mimetype setting ?

PS:
我尝试通过Servlet提供静态文件并设置正确的Mimetypes - >一切都完美无缺浏览器(chrome)我可以看到图像和.js内容(以及所有其他文件结尾)。

PS: I tried serving the static files via a Servlet and setting the correct Mimetypes -> everything works perfectly in browser (chrome) I can see the images and .js content (and all other file endings).

我的Servlet代码(应用程序在服务器的/运行) :

My Servlet Code (app is running at "/" of server):

@WebFilter("/*")  //get all requests
public class MasterFilter implements javax.servlet.Filter {
        //...
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    String path = req.getRequestURI();

    if (path.startsWith("/resource")) {         
        String mimetype = "text/html;charset=UTF-8";

        mimetype = path.contains(".png") ? "image/png" : mimetype;
        mimetype = path.contains(".jpg") || path.contains(".jpeg") ? "image/jpeg" : mimetype;
        mimetype = path.contains(".js") ? "text/javascript" : mimetype;
        mimetype = path.contains(".css") ? "text/css" : mimetype;
        response.setContentType(mimetype);
        chain.doFilter(request, response); // Goes to static resource in local folder "webapp/resource/"

    }
}

有什么建议吗?
提前致谢。

Any suggestions ? Thanks in advance.

编辑:

使用Servlet过滤器的上述解决方案运行正常。但是由于@ JGlass的回答,我还找到了另一个解决方案。 (请记住,我绝对需要我的Servlet过滤器):

The above solution with the Servlet Filter works fine. But thanks to @JGlass's answer I also found another solution. (keep in mind that I absolutely need my Servlet Filter):


  1. MasterFilter类转发到ServeResourceservlet:

  1. "MasterFilter" class forwards to "ServeResource" servlet:

@WebFilter(/ *)
公共类MasterFilter实现javax.servlet.Filter {
/ * .. 。* /
public void doFilter(..){
/*...*/
if(path.startsWith(/ resource)){//转发到ServeResource servlet
}
}
}

2.ServeResourceservlet提供静态文件:

2."ServeResource" servlet serves static file:

@WebServlet("/resource/*")
public class ServeResource extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public ServeResource() {
    super();
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse 
   response)
 */
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws ServletException, IOException {

  ServletContext cntx= req.getServletContext();
  String fileUri = req.getRequestURI();
  System.out.println("fileUri: "+fileUri);
  // Get the absolute path of the image (or any file)
  String filename = cntx.getRealPath(fileUri);
  System.out.println("file realPath: "+filename);
  // retrieve mimeType dynamically
  String mime = cntx.getMimeType(filename);
  System.out.println("mime type: "+mime);
  if (mime == null) {
    resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    return;
  }

  resp.setContentType(mime);
  File file = new File(filename);
  resp.setContentLength((int)file.length());

  FileInputStream in = new FileInputStream(file);
  OutputStream out = resp.getOutputStream();

  // Copy the contents of the file to the output stream
   byte[] buf = new byte[1024];
   int count = 0;
   while ((count = in.read(buf)) >= 0) {
     out.write(buf, 0, count);
  } 
    out.close();
    in.close();
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

}

3.web.xml包含扩展名映射:

3.web.xml contains extension mappings:

    <mime-mapping>
    <extension>html</extension>
    <mime-type>text/html</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>txt</extension>
    <mime-type>text/plain</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>js</extension>
    <mime-type>text/javascript</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>jpg</extension>
    <mime-type>image/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>jpeg</extension>
    <mime-type>image/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>png</extension>
    <mime-type>image/png</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>css</extension>
    <mime-type>text/css</mime-type>
</mime-mapping>
<mime-mapping>
    <extension>zip</extension>
    <mime-type>application/zip</mime-type>
</mime-mapping>


推荐答案

你可以将你的mime-types映射放在你的网站上.XML。这是一个例子:

You can put your mime-types mapping in your web.xml. Here's an example:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>TestDynamicWAR</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>testServlet</servlet-name>
        <servlet-class>com.mycompany.test.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>testServlet</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

    <mime-mapping>
        <extension>html</extension>
        <mime-type>text/html</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>txt</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>jpg</extension>
        <mime-type>image/jpeg</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>png</extension>
        <mime-type>image/png</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>js</extension>
        <mime-type>text/plain</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>css</extension>
        <mime-type>text/css</mime-type>
    </mime-mapping> 

</web-app>

注意:您可能不需要css和js已经在工作了。 html和txt mime类型只是一个例子



如果你只是想处理mime类型,我不相信你需要处理servlet过滤器。这个SO帖子有一个处理mime类型的servlet 从servlet输出一个图像文件

Note: you likely don't need the css and js as they're already working. html and txt mime types are just an example as well

And I dont believe you need to deal with the servlet filter if you just want to handle the mime-types. This SO post has the servlet dealing with the mime types Output an image file from a servlet

这篇关于Wildfly Undertow文件Mimetypes的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆