我有一个充当前端控制器的 servlet。
@WebServlet("/*")
但是,这也处理 CSS 和图像文件。我怎样才能防止这种情况?
您有 2 个选项:
使用更具体的 URL 模式,例如/app/*
or *.do
,然后让您的所有页面请求都匹配此 URL 模式。另请参阅设计模式基于 Web 的应用程序
与 1 相同,但要从请求 URL 中隐藏 servlet 映射;然后,您应该将所有静态资源放在一个公共文件夹中,例如/static
or/resources
并创建一个过滤器来检查请求 URL 是否与其不匹配,然后转发到 servlet。这是一个示例,它假设您的控制器 servlet 是 a@WebServlet("/app/*")
并且过滤器是 a@WebFilter("/*")
并且您的所有静态资源都在/resources
文件夹中。
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());
if (path.startsWith("/resources/")) {
chain.doFilter(request, response); // Goes to default servlet.
} else {
request.getRequestDispatcher("/app" + path).forward(request, response); // Goes to your controller.
}
我知道这是一个老问题,我猜@BalusC 的答案可能很好用。但是我无法修改正在处理的 JSF 应用程序的 URL,所以我只需检查路径并返回是否是静态资源:
String path = request.getRequestURI().substring(request.getContextPath().length());
if (path.contains("/resources/")) {
return;
}
这对我来说很好。