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

时间:2012-11-23 00:57:48

标签: servlets

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

@WebServlet("/*")

但是,这也处理CSS和图像文件。我该如何防止这种情况?

2 个答案:

答案 0 :(得分:18)

您有两个选择:

  1. 使用更具体的网址格式,例如/app/**.do,然后让所有网页请求都与此网址格式相匹配。另请参阅Design Patterns web based applications

  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.
    }
    

    另见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;
    }

这对我来说很好。