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

Vad*_*dim 15 servlets

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

@WebServlet("/*")
Run Code Online (Sandbox Code Playgroud)

但是,这也处理CSS和图像文件.我怎么能阻止这个?

Bal*_*usC 19

你有2个选择:

  1. 使用更具体的URL模式(如/app/*或)*.do,然后让所有页面请求与此URL模式匹配.另请参见设计模式基于Web的应用程序

  2. 与1相同,但您希望隐藏请求URL中的servlet映射; 然后,您应该将所有静态资源放在一个公共文件夹(例如/static或)中,/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.
    }
    
    Run Code Online (Sandbox Code Playgroud)

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