18

我有一个充当前端控制器的 servlet。

@WebServlet("/*")

但是,这也处理 CSS 和图像文件。我怎样才能防止这种情况?

4

2 回答 2

23

您有 2 个选项:

  1. 使用更具体的 URL 模式,例如/app/*or *.do,然后让您的所有页面请求都匹配此 URL 模式。另请参阅设计模式基于 Web 的应用程序

  2. 与 1 相同,但要从请求 URL 中隐藏 servlet 映射;然后,您应该将所有静态资源放在一个公共文件夹中,例如/staticor/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.
    }
    

    另请参阅在 /* 上映射全局前端控制器 servlet 时如何访问静态资源

于 2012-11-23T01:13:19.060 回答
0

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

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

这对我来说很好。

于 2017-08-02T13:54:11.460 回答