將全域前端控制器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中文網其他相關文章!