我有一个作为前端控制器的Servlet。
@WebServlet("/*")
然而,这也处理CSS和图像文件。我如何防止这种情况发生?
我有一个作为前端控制器的Servlet。
@WebServlet("/*")
然而,这也处理CSS和图像文件。我如何防止这种情况发生?
你有两个选择:
使用更具体的URL模式,比如/app/*
或*.do
,然后让所有页面请求匹配这个URL模式。参见设计模式-基于Web应用程序
与第1种方式相同,但是你想要隐藏请求URL中的servlet映射;你应该把所有静态资源放在一个共同的文件夹中,例如/static
或/resources
,并创建一个过滤器来检查请求URL是否与它匹配,然后转发到servlet。以下是一个示例,假设您的控制器servlet是@WebServlet("/app/*")
,过滤器是@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;
}
这对我来说很好用。