tomcat - 在/static/* 上下文中提供静态资源,同时保持我的 servlet 处理/* 上下文

标签 tomcat servlets servlet-container

<分区>

我的问题很简单。我想让我的静态资源在 /static/* 上下文中提供服务,但我的特定 servlet 服务于 /* 上下文。由于 /static/*/* 的子集,因此它不起作用。 我的 web.xml 如下所示:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 <display-name>template-guice-jersey-tomcat</display-name>
 <session-config>
     <session-timeout>30</session-timeout>
 </session-config>
 <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

 <!-- set up Google Guice Servlet integration -->
 <filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
 </filter>
 <filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

 <servlet-mapping>                                                                                                                               
   <servlet-name>default</servlet-name>                                                                                                          
   <url-pattern>/static/*</url-pattern>                                                                                                          
 </servlet-mapping>                                                                                                                              


 <listener>                                                                                                                                      
     <listener-class>de.danbim.templateguicejerseytomcat.GuiceServletConfig</listener-class>                                                     
 </listener>                                                                                                                                     
</web-app>  

最佳答案

这里有一个非常干净的解决这个问题的方法:http://www.kuligowski.pl/java/rest-style-urls-and-url-mapping-for-static-content-apache-tomcat,5 :

Unfortunately after looking into DefaultServlet source I found that DefaultServlet takes only pathInfo part of requested URL, so if your request is /static/styles.css, container translates it into /styles.css. Servlet part is omitted by the DefaultServlet. If you want to access such css file you should use /static/static/styles.css request url.

The simple solution of our problem is to write DefaultFilter class and place it at the beginning of web.xml file. This filter will forward all static content calls to DefaultServlet.

定义一个过滤器,它将请求分派(dispatch)给默认的 servlet:

public class DefaultFilter implements Filter {  
  
    private RequestDispatcher defaultRequestDispatcher;  
  
    @Override  
    public void destroy() {}  

    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)   
          throws IOException, ServletException {  
        defaultRequestDispatcher.forward(request, response);  
    }  

    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  
        this.defaultRequestDispatcher =   
            filterConfig.getServletContext().getNamedDispatcher("default");  
    }  
}

将过滤器(在其他过滤器之前)添加到 web.xml:

<filter>  
    <filter-name>default</filter-name>  
    <servlet-name>default</servlet-name>  
    <filter-class>pl.kuligowski.example.DefaultFilter</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>default</filter-name>  
    <url-pattern>/static/*</url-pattern>  
    <url-pattern>*.ico</url-pattern>  
</filter-mapping>

Only static content calls are matched to DefaultFilter, which simply breaks the filter chain and forwards the request to the DefaultServlet.

关于tomcat - 在/static/* 上下文中提供静态资源,同时保持我的 servlet 处理/* 上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14539076/

相关文章:

oracle - 从 Tomcat 7 迁移到 Tomcat 9 后启动 Tomcat 的问题

java - 如何从安装了 Apache tomcat 服务器的 Linux 服务器中删除 catalina.out

java - 从另一个 Java Servlet 激活一个 Java Servlet

java - Servlet 错误 :- 404 Not Found using HTML WEB FORM DATA

java - 获取Java webapp中的所有用户和角色

tomcat - mvn tomcat7 :run - How does it work?

jquery - 如何根据角色隐藏 Web 应用程序用户的选项卡

java - Netbeans 不会部署到 Tomcat

java - Jersey 的 ServletContainer init 方法可以被重写吗?

java - 如何延迟所有tomcat服务器请求