我有一个servlet作为前端控制器。
@WebServlet("/*")
但是,这也处理CSS和图像文件。我该如何防止这种情况?
答案 0 :(得分:18)
您有两个选择:
使用更具体的网址格式,例如/app/*
或*.do
,然后让所有网页请求都与此网址格式相匹配。另请参阅Design Patterns web based applications
与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.
}
另见How to access static resources when mapping a global front controller servlet on /*。
答案 1 :(得分:0)
我知道这是一个老问题,我想@BalusC的答案可能正常。但是我无法修改正在处理的JSF应用程序的URL,所以我只是检查路径并返回静态资源:
String path = request.getRequestURI().substring(request.getContextPath().length());
if (path.contains("/resources/")) {
return;
}
这对我来说很好。