Home >Java >javaTutorial >How to Access Static Resources with a Global Front Controller Servlet Mapped to /*?

How to Access Static Resources with a Global Front Controller Servlet Mapped to /*?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-04 02:50:10407browse

How to Access Static Resources with a Global Front Controller Servlet Mapped to /*?

Accessing Static Resources when Mapping Global Front Controller Servlet on /*

Mapping a global front controller servlet on /* can prevent the access to static resources such as CSS, JS, and images. To resolve this, consider the following steps:

Map the Controller Servlet on a More Specific URL Pattern

Instead of mapping the servlet on /, use a more specific pattern like /pages/. This allows static content to be stored in a separate folder, such as /static.

Create a Filter for Handling Static Content

Create a filter that listens on /* and transparently handles requests for static content by forwarding them to the default servlet. For any other requests, the filter should dispatch to the controller servlet.

Here's an example of a filter configuration:

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Filter Implementation:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;

public class Filter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest req = (HttpServletRequest) request;
        String path = req.getRequestURI().substring(req.getContextPath().length());

        if (path.startsWith("/static")) {
            chain.doFilter(request, response); // Goes to default servlet.
        } else {
            request.getRequestDispatcher("/pages" + path).forward(request, response);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

Controller Servlet Mapping:

<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

This approach allows static content to be served transparently while directing other requests to the controller servlet.

The above is the detailed content of How to Access Static Resources with a Global Front Controller Servlet Mapped to /*?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn