首頁 >Java >java教程 >如何使用映射到 /* 的全域前端控制器 Servlet 存取靜態資源?

如何使用映射到 /* 的全域前端控制器 Servlet 存取靜態資源?

Patricia Arquette
Patricia Arquette原創
2024-12-04 02:50:10549瀏覽

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

將全域前端控制器Servlet 對應/*

將全域前端控制器Servlet 對應到/* 時存取靜態資源可以阻止存取CSS、JS、圖片等靜態資源。要解決此問題,請考慮以下步驟:

將控制器Servlet 對應到更具體的URL 模式

不要將Servlet 對應到/,而是使用更具體的模式,例如/pages/。這允許將靜態內容儲存在單獨的資料夾中,例如 /static。

建立一個用於處理靜態內容的過濾器

建立一個監聽/* 的過濾器並透過將靜態內容的請求轉發到預設servlet 來透明地處理這些請求。對於任何其他請求,過濾器應分派到控制器 servlet。

以下是過濾器配置範例:

<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>

過濾器實作:

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() {
    }
}

<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>

控制器Servlet映射:這種方法允許透明地提供靜態內容,同時將其他請求定向到控制器 servlet。

以上是如何使用映射到 /* 的全域前端控制器 Servlet 存取靜態資源?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn