如何防止被映射在 /* 的前端控制器Servlet处理静态资源。

19

我有一个作为前端控制器的Servlet。

@WebServlet("/*")

然而,这也处理CSS和图像文件。我如何防止这种情况发生?

2个回答

24

你有两个选择:

  1. 使用更具体的URL模式,比如/app/**.do,然后让所有页面请求匹配这个URL模式。参见设计模式-基于Web应用程序

  2. 与第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.
}

另见如何在将全局前端控制器servlet映射到/*时访问静态资源。


@BalusC,为什么通过控制器加载静态资源会抛出404错误? 我将过滤器映射到/*。当加载jquery文件时,它会抛出404错误-找不到资源。 我通过使用您提供的解决方案来解决了这个问题。 您能否请澄清我的疑惑? - Pooja Dubey

0

我知道这是一个老问题,我猜@BalusC的答案可能很好用。但是我无法修改我正在处理的JSF应用程序的URL,所以我只是检查路径并在其指向静态资源时返回:

    String path = request.getRequestURI().substring(request.getContextPath().length());
    if (path.contains("/resources/")) {
        return;
    }

这对我来说很好用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接